【发布时间】:2016-12-01 06:46:05
【问题描述】:
我在 Spring Boot 应用程序中通过 Java 配置设置 ACL 时遇到问题。我创建了一个小项目来重现这些问题。
我尝试了几种不同的方法。我遇到的第一个问题是 EhCache,在我修复了这个问题之后(我假设我做到了)我无法再登录,而且看起来所有数据都消失了。
有4个不同配置的类:
ACLConfig1.class
ACLConfig2.class
ACLConfig3.class
ACLConfig4.class
所有@PreAuthorize 和@PostAuthorize 注释都按预期工作,hasPermission 除外。
Controller 拥有 4 个端点:一个用于 User,一个用于 Admin,一个用于 Public,最后一个让我头疼 @PostAuthorize("hasPermission(returnObject,'administration')")
我很确定数据库中的插入是正确的。这门课是四门课程之一,也是我尝试过的最后一门课程:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class ACLConfig4 {
@Autowired
DataSource dataSource;
@Bean
public EhCacheBasedAclCache aclCache() {
return new EhCacheBasedAclCache(aclEhCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy());
}
@Bean
public EhCacheFactoryBean aclEhCacheFactoryBean() {
EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean();
ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject());
ehCacheFactoryBean.setCacheName("aclCache");
return ehCacheFactoryBean;
}
@Bean
public EhCacheManagerFactoryBean aclCacheManager() {
return new EhCacheManagerFactoryBean();
}
@Bean
public DefaultPermissionGrantingStrategy permissionGrantingStrategy() {
ConsoleAuditLogger consoleAuditLogger = new ConsoleAuditLogger();
return new DefaultPermissionGrantingStrategy(consoleAuditLogger);
}
@Bean
public AclAuthorizationStrategy aclAuthorizationStrategy() {
return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMINISTRATOR"));
}
@Bean
public LookupStrategy lookupStrategy() {
return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger());
}
@Bean
public JdbcMutableAclService aclService() {
JdbcMutableAclService service = new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache());
return service;
}
@Bean
public DefaultMethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() {
return new DefaultMethodSecurityExpressionHandler();
}
@Bean
public MethodSecurityExpressionHandler createExpressionHandler() {
DefaultMethodSecurityExpressionHandler expressionHandler = defaultMethodSecurityExpressionHandler();
expressionHandler.setPermissionEvaluator(new AclPermissionEvaluator(aclService()));
expressionHandler.setPermissionCacheOptimizer(new AclPermissionCacheOptimizer(aclService()));
return expressionHandler;
}
}
我在这里缺少什么?如果我使用 ACLConfig3.class 或为什么我没有数据 ACLConfig4.class。有没有关于如何在 Spring Boot 中以编程方式配置它的示例?
【问题讨论】:
-
你的问题让我有点困惑。
@PostAuthorize("hasPermission(returnObject,'administration')")不是您唯一的问题吗? -
@xnakos,理想的数据需要被缓存。当管理工作应该很容易通过 DB 设置读写权限
-
@5er 您能否分享示例数据库条目以授权用户对数据对象进行特定操作?我真的需要similar topic 的帮助。
-
有没有什么好的链接可以用postgre在Spring Boot中实现ACL
标签: java spring-security spring-boot acl spring-cache