Autenticação WebService com SpringSecurity Core
21/11/2012 16:59
1
Ola,

estou precisando de ajuda para integração de um sistema de minha empresa. Criamos uma base de dados que centraliza todas as informações em apenas um servidor de autenticação.

Para autenticação devemos usar uma url interna semelhante a esta:
http://autenticacao/ServletAutenticacao?login=XXXXXXXXXX&senha=YYYYYYYYY


onde XXXXXXXX é o username e YYYYYYYYY a senha criptografada no algoritmo MD5. Como retorno recebo um XML:


<autentication>
<login>XXXXXXXX</login>
<senha>true</senha>
</autentication>


Alguém saberia como posso implementar isso no plugin SpringSecurity Core?
Tags: SpringSecurity, Autenticação, WebService


0
Boa tarde Ovidio, você poderia detalhar um pouco mais o cenário para que possamos ajudá-lo?

Algumas perguntas:
Esse serviço que irá validar a autenticação, é grails?
Qual a necessidade da autenticação? Você precisará controlar permissões ou regras de acesso diferenciadas para cada tipo de usuário?
Você irá armazenar após a autenticação esse usuário na sua base de dados?

[]'s
21/11/2012 17:33


0
O 'ServletAutenticacao' não é em Grails. Porém, independente da linguagem a cada chamada com as variaveis ele retorna o XML.

A necessidade é apenas para autenticação. As permissões serão controladas pelo SpringSecurity Core.

Após a autenticação, será armazenado a data do último acesso só isso.
21/11/2012 17:44


1
Ok... Faço algo semelhante, porém minha autenticação ocorre através do serviço LDAP.
O spring security baseia-se em domínios de usuários e regras. No meu caso tive que persistir o usuário na base de dados para uso posterior em outros relacionamentos.

Sinceramente, não sei se você consegue usar o security sem usar pelo menos um domínio User e um Role. Até pq se você for controlar permissões, essa associação vai ter de existir.

Em meu caso solucionei da seguinte forma:

1- Possuo os domínios gerados com auxílio do s2-quickstart: User, Role, UserRole
2- Modifiquei a User para adequar-se a meus requisitos... Você poderia por exemplo armazenar somente nome.
3- Sobrescrevi os serviços padrões de autenticação do spring core: MyUserDetails, MyUserDetailsContextMapper e MyUserDetailsService.
4- Quando o usuário loga-se, o plugin ldap valida a autenticação em meu servidor, eu recupero os dados em MyUserDetailsContextMapper. Caso o usuário não exista ele é persistido no banco. Um novo objeto MyUserDetails com os dados do usuário é criado (esse objeto é o da seção)
22/11/2012 10:48


0
Ola Ovidio! Achei interessante essa autenticação. Como você pretende apenas centralizar as senhas, fazer uma pré-autenticação no servidor de autenticação e depois prosseguir com a autenticação normalmente no Spring Security core seria melhor né?

Porque daí você mantem todos os benefícios do plugin a disposição. Uma action poderia ser chamada para fazer essa "pre-autenticação" e em caso de sucesso redirecionado para a action normal do spring security.
22/11/2012 12:15


0
Luciano,

eu não vi possibilidades de usar o plugin parcialmente por isso mesmo autenticando no servidor remoto, necessitarei de criar uma autenticação local. A vantagem de ter uma central de autenticação é que várias pendências relacionados a negocios da emrpesa são vinculados lá. Por exemplo se um funcionário sair ele é desativado lá e todos os sistemas são bloqueados para impedir seu acesso. O LDAP é um tipo de autenticação interessante, mas infelizmente não é o que estou procurando agora. O ivgsilva deu uma proposta interessante de fazer uma "pré-autenticação" remota e prosseguir com a local. é mais ou menos isso que estou procurando. O problema é que eu não sei os comandos em grails para (1) chamar a URL com os parametro desejados, (2) receber os parâmetros de retorno do XML, (3) abrir e analisar o item <senha> do XML e (4) passar o usuario e senha autenticados para prosseguir com a autenticação do Plugin local. Alguém saberia estes comandos? Acha que funcionária nesta lógica?
22/11/2012 14:05


0
opa.... esqueci de agradecer....

Luciano e ivgsilva.... obrigado pela colaboração.
22/11/2012 14:08


1
Ovidio, eu uso o seguinte.

Tenho 2 aplicações para o usuário e 1 aplicação (nucleos) onde ele apenas valida o usuário e a aplicação. Por exemplo:

Usuário: Fulano
Senha: 123
Aplicação: R8974938058REGEUJFHJ4893
// toda aplicação tem um código único para liberar ou não, porque no meu caso, um determinado usuário pode acessar a 1a aplicação, porém não acessar a 2a.

Eu criptografo a senha, gero uma chave do dia (Esta chave é para que niguém salve essa url em um robo e fique logando no meu sistema) e mando para o nucleos via json.
O nucleos verifica se a chave é válida, verifica se o usuário existe e se a senha está correta, e por último, verifica se ele pode acessar essa aplicação.
E devolvo um json com a resposta que preciso.

Lembrando que o banco é o mesmo para as 3 aplicações. (necessidade da empresa).

1 aplicação é em Mentawai
1 aplicação em Grails
O Núcleos é em Grails

        
try {
BasicHttpParams httpParameters = new BasicHttpParams();
URL url = new URL("http://enderecoAplicacaoEController/autenticaAplicacao?usuario=" + usuarioStr + "&senha=" + senha + "&chaveApp=" + chaveApp + "&chaveDia=" + chaveDia);
HttpConnectionParams.setSoTimeout(httpParameters, timeout);
DefaultHttpClient client = new DefaultHttpClient(httpParameters);
String getURL = url.toString();
HttpGet get = new HttpGet(getURL);
HttpResponse responseGet = client.execute(get);
HttpEntity resEntityGet = responseGet.getEntity();
if (resEntityGet != null) {
resposta = EntityUtils.toString(resEntityGet);
String json = resposta;
JSONObject jsonObject = JSONObject.fromObject(json);
// System.out.println("erro: " + jsonObject.get("erro"));
// System.out.println("usuario: " + jsonObject.get("usuario"));
// System.out.println("chave: " + jsonObject.get("chave"));
// System.out.println("mensagem: " + jsonObject.get("mensagem"));
boolean erro = new Boolean(jsonObject.get("erro").toString());
if (erro) {
String msg = jsonObject.get("mensagem").toString();
addError(msg);
return INICIO;
} else {
idUsuario = Integer.parseInt(jsonObject.get("usuario").toString());
chaveRecebida = jsonObject.get("chave").toString();
}
}
} catch (Exception ex) {
System.out.println("Erro ao conectar: " + ex.getMessage());
}
// gera a chave com o usuario recebido e testa para verificar a integridade do login
chaveDia = Utils.criptografarTexto("qualquer coisa");
if (!chaveDia.equals(chaveRecebida)) {
addError("Chave de acesso divergente! Provavelmente voc&ecirc; est&aacute; tentando acessar de um link de favoritos inv&aacute;lido.");
return INICIO;
}


Esse código acima é o Mentawai.

E o do nucleos com o grails é simples, apenas um método que trata esses parâmetros e retorna um json.

espero ter ajudado.
22/11/2012 16:13


1
E ai Ovidio blz?

Eu acho que a ideia do Carlos Alberto está muito boa e o código esta bastante legível!

Só pra ajudar mesmo deixo aqui a opção de implementar o uso do HTTPBuilder para fazer o 'request' e a análise da resposta. O plugin REST também pode ajudar. Se precisar tem alguns exemplos muito interessantes neste link.



23/11/2012 00:46


0
Galera,

muito obrigado pela ajuda!

Também achei o exemplo do Carlos muito legal e pelo que entendi o httpbuilder possui a mesma função com maior facilidade de implementação e manutenção.

Acho que vou converter o exemplo do carlos para o httpbuilder e implementar em minha aplicação.

Galera valeu mesmo.

O grails está crescendo porque nossa comunidade está ajudando iniciantes como eu.

Abraço a todos
23/11/2012 12:44



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto