首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring安全性不同角色DTAP

Spring安全性不同角色DTAP
EN

Stack Overflow用户
提问于 2014-08-26 08:03:29
回答 1查看 716关注 0票数 0

我们目前在环境中有不同的角色,例如在开发中我们有名为USRADM的角色,而在生产中它们使用全名,例如USERADMINADMINISTRATOR

我解决这个问题的想法是使用一个属性文件和一个占位符作为滚动名,例如,这是我的属性文件:

代码语言:javascript
复制
role.user='USER'
role.admin='ADMIN', 'ADMINISTRATOR'

在我的AppConfig中,我在类的顶部添加了以下注释:

代码语言:javascript
复制
@PropertySource("classpath:roles.properties")
public class AppConfig {

}

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

代码语言:javascript
复制
@PreAuthorize("hasAnyRole(${role.admin})")
public Item deleteItem(int id) {

}

然而,这导致了以下例外情况:

代码语言:javascript
复制
Caused by: org.springframework.expression.spel.SpelParseException: EL1043E:(pos 12): Unexpected token.  Expected 'rparen())' but was 'lcurly({)'

因为它说它不删除大括号,所以我还尝试了以下方法:@PreAuthorize("hasAnyRole(role.admin)"),结果是:

代码语言:javascript
复制
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 11): Property or field 'role' cannot be found on object of type 'org.springframework.security.access.expression.method.MethodSecurityExpressionRoot' - maybe not public?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-07 07:48:39

@PreAuthorize中使用的Spring只具有:

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

见这个答案https://stackoverflow.com/a/3786581/883859

您可以通过@访问其他bean

代码语言:javascript
复制
 public interface RoleNameGetter {
    String getSuperUserRole();
    ...
 }

代码语言:javascript
复制
 @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中的属性文件中的角色名,如下所示:

代码语言:javascript
复制
  @PreAuthorize("hasAnyAuthority(@roleNameGetter.getSuperUserRole(),@roleNameGetter.getNormalUserRole())")
  public void end() {...}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25500874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档