Anotaciones de complementos de acegas de Grils
-
22-09-2019 - |
Pregunta
Estoy usando las anotaciones proporcionadas por el complemento Spring Security (también conocido como ACEGI). Tengo acciones del controlador anotadas con
@Secured(['ROLE_ADMIN', 'ROLE_USER'])
Para indicar que deberían estar disponibles para administradores y usuarios regulares. Pero ahora debo indicar que una acción está disponible para administradores y usuarios no registrados. ¿Es posible usar anotaciones para indicar a un usuario sin ningún papel, es decir, no registrado?
Gracias Don
Solución
Aquí hay una solución que requiere que no se registre, o que tenga rol_admin. Necesita un votante personalizado que procese un nuevo token 'is_not_authenticated':
package com.burtbeckwith.grails.springsecurity
import org.springframework.security.Authentication
import org.springframework.security.AuthenticationTrustResolverImpl
import org.springframework.security.ConfigAttribute
import org.springframework.security.ConfigAttributeDefinition
import org.springframework.security.vote.AccessDecisionVoter
class NotLoggedInVoter implements AccessDecisionVoter {
private authenticationTrustResolver = new AuthenticationTrustResolverImpl()
int vote(Authentication authentication, object, ConfigAttributeDefinition config) {
for (configAttribute in config.configAttributes) {
if (supports(configAttribute)) {
if (authenticationTrustResolver.isAnonymous(authentication)) {
// allowed if not logged in
return ACCESS_GRANTED
}
for (authority in authentication.authorities) {
if ('ROLE_ADMIN' == authority.authority) {
// allowed if logged in as an admin
return ACCESS_GRANTED
}
}
}
}
return ACCESS_DENIED
}
boolean supports(ConfigAttribute attribute) {
'IS_NOT_AUTHENTICATED' == attribute?.attribute
}
boolean supports(Class clazz) {
true
}
}
Registre esto como un frijol en recursos. Groovy:
beans = {
notLoggedInVoter(com.burtbeckwith.grails.springsecurity.NotLoggedInVoter)
}
y agréguelo a la lista de votantes en SecurityConfig.Groovy estableciendo la propiedad 'DecisionVoternames':
decisionVoterNames = ['notLoggedInVoter', 'authenticatedVoter', 'roleVoter']
y anotar su acción del controlador con esto:
@Secured(['IS_NOT_AUTHENTICATED'])
Y solo permitirá usuarios no autorenticados y usuarios autenticados con rol_admin.
Otros consejos
El token para eso es IS_Authenticated_Anonymy, lo que significa cualquier persona, ya sea que haya iniciado sesión o no. Is_authenticated_remembered significa que cualquiera inició sesión con una cookie recordar o mediante inicio de sesión explícito, e is_authenticated_fly significa iniciado sesión a través de un inicio de sesión explícito (no usando cookie).
Si anotas tu acción con
@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
Entonces permitirá que cualquiera acceda a esa acción. Puede combinar estos tokens especiales con roles, por ejemplo, por ejemplo, para permitir el solo administrador, pero forzar un inicio de sesión de nombre de usuario/contraseña incluso si el usuario tiene una cookie de recordarme que usaría
@Secured(['ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY'])