7

假设我的 Spring Security 和属性配置正确,我想使用属性中的角色名称,例如

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

我在上面的代码示例中尝试过,但它不起作用(它需要 '${role.rolename}' 字符串作为比较角色)

如果我切换到

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

它工作得很好。我对这种用法的动机是在各种环境中的应用程序测试中具有更好的灵活性。

4

3 回答 3

14

尝试删除''标志:

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

编辑。我确信有更好的方法,但作为一种解决方法,您可以在某些 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() {}
于 2013-08-13T11:14:06.700 回答
1

我发现您可以直接获取 propertyResolver 并从中提取值,而不是像@Maksym 建议的那样编写自己的类。

示例:

@PreAuthorize("hasRole(@environment.getProperty('role.rolename')")
public void method() {}
于 2017-07-28T15:52:32.723 回答
0

基于此处的其他答案,让我感到困惑的一件事是没有在OAuth2MethodSecurityExpressionHandler.

确保在您MethodSecurityConfig加载上下文以使上述答案起作用。

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

然后就可以成功访问了

@PreAuthorize("hasRole(@environment.getProperty('role.rolename')")
public void method() {}
于 2018-09-12T21:26:55.920 回答