spring-security - manager - spring security anotaciones
Acegi Security: ¿Cómo agrego otra GrantedAuthority a la autenticación a un usuario anónimo? (1)
Doy a los usuarios una URL especial con clave de acceso. los usuarios que acceden a la página pública a través de esta URL especial deberían poder ver algunos datos adicionales en comparación con un usuario anónimo simple.
Quiero dar un rol adicional al usuario anónimo basado en los parámetros proporcionados en la solicitud para que pueda hacer algo como esto en mi plantilla:
<@sec.authorize ifAnyGranted="ROLE_ADMIN, ROLE_USER, ROLE_INVITED_VISITOR">
...some additional stuff for invited user to see
</@sec.authorize>
Actualmente estoy implementando el OncePerRequestfilter
de Spring:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
if (null != request.getParameter("accessKey")) {
if(isValid(request.getParameter("accessKey"))) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
//how do i add additional roles to authenticated (potentially anonymous) user?
}
}
}
¿Por qué no crear una clase contenedora que delegue en el original, pero agrega un par de GrantedAuthorities adicionales?
public class AuthenticationWrapper implements Authentication
{
private Authentication original;
private GrantedAuthority[] extraRoles;
public AuthenticationWrapper( Authentication original, GrantedAuthority[] extraRoles )
{
this.original = original;
this.extraRoles = extraRoles;
}
public GrantedAuthority[] getAuthorities()
{
GrantedAuthority[] originalRoles = original.getAuthorities();
GrantedAuthority[] roles = new GrantedAuthority[originalRoles.length + extraRoles.length];
System.arraycopy( originalRoles, 0, roles, 0, originalRoles.length );
System.arraycopy( extraRoles, 0, roles, originalRoles.length, extraRoles.length );
return roles;
}
public String getName() { return original.getName(); }
public Object getCredentials() { return original.getCredentials(); }
public Object getDetails() { return original.getDetails(); }
public Object getPrincipal() { return original.getPrincipal(); }
public boolean isAuthenticated() { return original.isAuthenticated(); }
public void setAuthenticated( boolean isAuthenticated ) throws IllegalArgumentException
{
original.setAuthenticated( isAuthenticated );
}
}
y luego haz esto en tu filtro:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
GrantedAuthority extraRoles = new GrantedAuthority[2];
extraRoles[0] = new GrantedAuthorityImpl( "Role X" );
extraRoles[1] = new GrantedAuthorityImpl( "Role Y" );
AuthenticationWrapper wrapper = new AuthenticationWrapper( auth, extraRoles );
SecurityContextHolder.getContext().setAuthentication( wrapper );
La Autenticación ahora se reemplaza por su versión con los roles adicionales. Nota: es posible que tenga que manejar el caso en el que la Autenticación aún no ha sido autenticada, por lo que getAuthorities () devuelve nulo. (La implementación de contenedor actualmente asume que siempre obtendrá una matriz no nula de su Autenticación envuelta)