Spring security @Preautorizar hasRole() propiedades de la inyección

Suponiendo que mi Primavera Seguridad y propiedades están configurados correctamente, me gustaría usar el nombre de rol de la propiedad como

@PreAuthorize("hasRole('${role.rolename}')")
public void method() {}

Me han tratado como en el ejemplo de código anterior, pero no funciona (se necesita '${papel.rolename}' de la Cadena como papel para comparar)

Si me cambio a

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void method() {}

funciona muy bien. Mi motivación de uso, es mejor flexibilidad en la aplicación de pruebas en diferentes ambientes.

  • Respuesta seleccionada
    Maksym Demidas
    13 de agosto de 2013

    Intente quitar '' signos:

    @PreAuthorize("hasRole(${role.rolename})")
    public void method() {}
    

    EDIT. Estoy seguro de que hay una mejor manera, pero como una solución puede llamar a algunos de método en algunos bean:

    @Component("appVariablesHolder")
    public class AppVariablesHolder {
    
        @Value("${role.rolename}") 
        private String someRole;
    
        public String getSomeRole() {
            return this.someRole;
        }
    }
    
    @PreAuthorize("hasRole(@appVariablesHolder.getSomeRole())")
    public void method() {}
    

2 Respuestas

  • Ben L.
    28 de julio de 2017

    He encontrado que se puede agarrar el propertyResolver y tire directamente los valores de que, en lugar de escribir su propia clase como fue sugerido por @Maksym.

    Exammple:

    @PreAuthorize("hasRole(@environment.getProperty('role.rolename')")
    public void method() {}
    
  • Chris Turner
    12 de septiembre de 2018

    Edificio en otras respuestas aquí, una cosa que se tropezó conmigo no fue el contexto en el OAuth2MethodSecurityExpressionHandler.

    Asegúrese de que en el MethodSecurityConfig está cargando el contexto de las respuestas anteriores a trabajar.

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    
        @Autowired
        private ApplicationContext context;
    
        @Override
        protected MethodSecurityExpressionHandler createExpressionHandler() {
            OAuth2MethodSecurityExpressionHandler handler = new OAuth2MethodSecurityExpressionHandler();
            handler.setApplicationContext(context);
    
            return handler;
        }
    }
    

    A continuación, puede acceder a

    @PreAuthorize("hasRole(@environment.getProperty('role.rolename')")
    public void method() {}