Spring security @PreAuthorize hasRole() Eigenschaften der Injektion

Vorausgesetzt, dass meine Frühlings-Sicherheit und-Eigenschaften ordnungsgemäß konfiguriert sind, möchte ich Rolle den Namen von der Eigenschaft, wie

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

Ich habe versucht, wie im obigen code-Beispiel, aber es funktioniert nicht (es dauert '${Rolle.Funktionsname}' String als Rolle zu vergleichen)

Wenn ich wechseln

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

es funktioniert ganz gut. Meine motivation für eine solche Nutzung ist eine bessere Flexibilität in der Anwendung der tests auf unterschiedlichen Umgebungen.

  • Ausgewählte Antwort
    Maksym Demidas
    13. August 2013

    Versuchen, zu entfernen '' Zeichen:

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

    EDIT. Ich bin mir sicher, dass es einen besseren Weg, aber als workaround können Sie rufen eine Methode auf manchen 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 Antworten

  • Ben L.
    28. Juli 2017

    Ich habe festgestellt, dass Sie können nur greifen die propertyResolver und ziehen Sie die Werte direkt aus, dass anstelle des Schreibens Ihrer eigenen Klasse, so wurde vorgeschlagen von @Maksym.

    Exammple:

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

    Aufbauend auf andere Antworten hier, eine Sache, die ausgelöst mich war nicht die Einstellung der Kontext auf die OAuth2MethodSecurityExpressionHandler.

    Stellen Sie sicher, dass in MethodSecurityConfig, die Sie laden, den Kontext für die Antworten oben zu arbeiten.

    @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;
        }
    }
    

    Dann können Sie erfolgreich Zugang

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