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?

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top