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

¿Fue útil?

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'])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top