我们目前在我们的环境中有不同的角色,例如在开发中我们有USR
和ADM
的角色,而在生产中他们使用全名,例如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,而是查看特定类的属性。
有没有人有想法解决这个问题?或者是否有另一种/更好的解决环境特定角色的解决方案?
答案 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() {...}