Spring安全性不同角色DTAP

时间:2014-08-26 08:03:29

标签: spring spring-security spring-el

我们目前在我们的环境中有不同的角色,例如在开发中我们有USRADM的角色,而在生产中他们使用全名,例如USER,{{1 }和ADMIN

我解决此问题的想法是使用属性文件和角色名称占位符,例如,这是我的属性文件:

ADMINISTRATOR

在我的role.user='USER' role.admin='ADMIN', 'ADMINISTRATOR' 中,我在课程顶部添加了以下注释:

AppConfig

在我的服务中,我现在正在使用:

@PropertySource("classpath:roles.properties")
public class AppConfig {

}

但是,这会导致以下异常:

@PreAuthorize("hasAnyRole(${role.admin})")
public Item deleteItem(int id) {

}

因为它说它不会消除花括号,我也尝试了以下内容:Caused by: org.springframework.expression.spel.SpelParseException: EL1043E:(pos 12): Unexpected token. Expected 'rparen())' but was 'lcurly({)' 导致:

@PreAuthorize("hasAnyRole(role.admin)")

至少表达式本身现在看起来有效,但它似乎没有查看属性文件no,而是查看特定类的属性。

有没有人有想法解决这个问题?或者是否有另一种/更好的解决环境特定角色的解决方案?

1 个答案:

答案 0 :(得分:2)

@PreAuthorize中使用的Spring EL只有:

  • 访问SecurityExpressionRoot的方法和属性。

  • 访问方法参数(需要使用调试信息或自定义ParameterNameDiscoverer进行编译):

请参阅此回答https://stackoverflow.com/a/3786581/883859

您可以通过@访问其他bean

 public interface RoleNameGetter {
    String getSuperUserRole();
    ...
 }

 @Configuration
 @PropertySource("classpath:xyz.properties")
 @EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
 public class Configuration {
    @Autowired
    protected Environment env;

    @Bean
    RoleNameGetter roleNameGetter() {
      return new RoleNameGetter() {
        @Override
        public String getSuperUserRole() {
            return env.getProperty("superuser_role_name");
        }
    };
}

允许从@PreAuthorize中使用的Spring EL中的属性文件访问角色名称,如下所示:

  @PreAuthorize("hasAnyAuthority(@roleNameGetter.getSuperUserRole(),@roleNameGetter.getNormalUserRole())")
  public void end() {...}