Spring Security pré-autenticação para o modo de desenvolvimento
-
21-08-2019 - |
Pergunta
Ao desenvolver uma aplicação que é bastante útil para ser capaz de rapidamente fazer login como usuários diferentes, com funções diferentes, para ver como o aplicativo se apresenta.
Digitando nomes de usuário e entrar a senha não é divertido, e um desperdício de tempo. O que eu gostaria de fazer é:
- adicionar uma página / painel com uma lista de nomes de usuário disponíveis;
- clicar em um nome de usuário irá gerar um evento para a segurança da Primavera que lhe permite reconhecer o usuário como autenticado, sem entrar senhas;
- Após clicar no link estou autenticado como o usuário especificado.
NB :.. As senhas são hash e apresentadas em texto simples utilizando formas, de modo codificar as senhas nos links não é uma opção
Obviamente este recurso só vai estar presente no tempo de desenvolvimento.
Como posso conseguir isso?
Solução
Eu tenho feito desta forma para uma aplicação web:
Eu tenho um parâmetro de configuração em context.xml
do servidor (claro apenas no servidor de desenvolvimento). Este parâmetro contém uma lista coma separados de nomes de usuários e senhas.
A página de login (jsp (x)) basta adicionar uma forma extra e botão enviar para cada nome de usuário, formam item de senha o parâmetro de contexto. Portanto, se um usuário clica no botão que o processo normal de login com os dados de login pré-definidos é acionado.
Servidor context.xml
...
<Context>
...
<Parameter name="quickLogin"
value="admin:passwd,user:otherPasswd"
override="false" />
</Context>
login.jspx
...
<!-- Login for debugging purposes -->
<c:forTokens items="${initParam.quickLogin}" delims="," var="loginPassword">
<c:set var="login" value="${fn:split(loginPassword, ':')[0]}" />
<c:set var="password" value="${fn:split(loginPassword, ':')[1]}" />
<form name="debugLogin" action="${form_url}" method="POST" >
<crsf:hiddenCrsfNonce/>
<input type="hidden" name='j_username' value="${fn:escapeXml(login)}" />
<input type="hidden" name='j_password' value="${fn:escapeXml(password)}" />
<input type="submit" value="${fn:escapeXml(login)} login" />
</form>
</c:forTokens>
...
Outras dicas
Use InMemoryDaoImpl para o modo de desenvolvimento. É muito fácil criar usuários e senhas armazenadas na memória:
<bean id="userDetailsService" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
<property name="userMap">
<value>
admin=admin,ROLE_ADMIN,ROLE_USER
user1=user1,ROLE_USER
user2=user2,ROLE_USER
</value>
</property>
</bean>
modo de desenvolvimento Em injetar isso ao seu provedor de autenticação. Na produção de substituí-lo com a aplicação adequada DB ou LDAP.
Como eu entendo que você gostaria de ter o SpringSecurity autenticá-lo automaticamente se algum URL específica é solicitado (e você teria um link para este URL no seu painel / página).
Como sobre a escrita de um filtro personalizado:
public class YourSpecialDevelopmentTimeFilter
extends AuthenticationProcessingFilter
implements SyncSecurityFilter
....
que iria substituir:
protected boolean requiresAuthentication(
HttpServletRequest request, HttpServletResponse response)
e retornar true dependendo de alguns parâmetros na request
?
não Claro que outra preocupação é ter essa funcionalidade em ambientes de produção. Isso é sempre uma coisa arriscada para ter diferentes código-base para dev e prod .