Spring Security pre-autenticación para el modo de desarrollo
-
21-08-2019 - |
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?
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 .