Spring security @PreAuthorize hasRole() properties injection

后端 未结 3 1719
被撕碎了的回忆
被撕碎了的回忆 2020-12-03 15:49

Assuming that my Spring Security and properties are configured properly, I would like to use role name from property like

@PreAuthorize(\"hasRole(\'${role.ro         


        
相关标签:
3条回答
  • 2020-12-03 16:19

    Building on other answers here, one thing that tripped me up was not setting the context on the OAuth2MethodSecurityExpressionHandler.

    Make sure that in your MethodSecurityConfig you're loading the context for the answers above to work.

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

    Then you can successfully access

    @PreAuthorize("hasRole(@environment.getProperty('role.rolename')")
    public void method() {}
    
    0 讨论(0)
  • 2020-12-03 16:22

    I've found that you can just grab the propertyResolver and pull values directly from that, instead of writing your own class as was suggested by @Maksym.

    Exammple:

    @PreAuthorize("hasRole(@environment.getProperty('role.rolename')")
    public void method() {}
    
    0 讨论(0)
  • 2020-12-03 16:32

    Try to remove '' signs:

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

    EDIT. I am sure that there is a better way, but as a workaround you can call some method on some 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() {}
    
    0 讨论(0)
提交回复
热议问题