Pregunta

Durante el desarrollo de una aplicación que es muy útil para poder acceder más rápidamente a los usuarios diferentes, con distintos roles, para ver cómo la aplicación se presenta.

Los nombres de usuario pulsa y que introducir la contraseña no es divertido, y una pérdida de tiempo. Lo que me gustaría hacer es:

  • añadir una página / panel con una lista de nombres de usuario disponibles;
  • hacer clic en un nombre de usuario generará un evento para la seguridad del resorte que permite que se reconoce al usuario como autenticado, sin introducir contraseñas;
  • después de hacer clic en el vínculo que estoy autenticado como el usuario especificado.

N.B .. Las contraseñas son ordenadas y presentadas en texto plano usando formas, por lo que codifica las contraseñas en los enlaces no es una opción

Obviamente Esta característica única presente en el tiempo de desarrollo.

¿Cómo puedo lograr esto?

¿Fue útil?

Solución

he hecho de esta manera para una aplicación web:

Tengo un parámetro de configuración en context.xml del servidor (por supuesto sólo en el servidor de desarrollo). Este parámetro contiene una lista coma separados de nombres de usuario y contraseñas.

La página de inicio de sesión (JSP (x)) sólo tiene que añadir una forma adicional y botón de enviar para cada nombre de usuario, contraseña elemento forman el parámetro de contexto. Así que si un usuario hace clic en ese botón el proceso de inicio de sesión normal con se trigged los datos de inicio de sesión predefinido.

context.xml servidor

...
<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>
...

Otros consejos

Uso InMemoryDaoImpl para el modo de desarrollo. Es muy fácil crear usuarios y contraseñas almacenadas en la memoria:

<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>

En el modo de desarrollo inyectar esto a su proveedor de autenticación. En la producción de sustituirla por la aplicación DB o LDAP adecuado.

Según entiendo que le gustaría tener la SpringSecurity que autenticar automáticamente si se solicita alguna URL específica (y que tendría un enlace a esta URL en su panel / página).

¿Cómo escribir un filtro personalizado:

public class YourSpecialDevelopmentTimeFilter 
extends AuthenticationProcessingFilter 
implements SyncSecurityFilter
....

que dejaría sin efecto:

protected boolean requiresAuthentication(
     HttpServletRequest request, HttpServletResponse response)

y volver verdadera función de algunos parámetros en el request?

Por supuesto, otra preocupación es no tener esta funcionalidad en los entornos de producción. Eso es siempre algo arriesgado tener diferente código base para dev y prod .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top