首先,我已经在google上进行了广泛的搜索,虽然似乎应该有一个修复程序,但我无法在@Bean
内成功引用注入(inject)的PermissionEvaluator
:
https://jira.springsource.org/browse/SEC-2136?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
在该问题的评论部分,Rob Winch提供了围绕建议的解决方案
话虽如此,我在实现发布的XML的基于注释的JavaConfig版本时遇到了麻烦。 我正在使用Spring Boot 1.0.0.BUILD-SNAPSHOT和spring-boot-starter-security。
我有一个类来配置方法安全性,如下所示:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
expressionHandler.setPermissionEvaluator(new MyPermissionEvaluator());
expressionHandler.setParameterNameDiscoverer(new SimpleParameterDiscoverer());
return expressionHandler;
}
}
和
PermissionEvaluator
的开头:public class MyPermissionEvaluator implements PermissionEvaluator {
private static final Logger LOG = LoggerFactory.getLogger(MyPermissionEvaluator.class);
@Autowired
private UserRepository userRepo;
@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
if (authentication == null || !authentication.isAuthenticated()) {
return false;
}
if (permission instanceof String) {
switch((String) permission) {
case "findUser":
return handleUserPermission(authentication, targetDomainObject);
default:
LOG.error("No permission handler found for permission: " + permission);
}
}
return false;
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
throw new RuntimeException("Id-based permission evaluation not currently supported.");
}
private boolean handleUserPermission(Authentication auth, Object targetDomainObject) {
if (targetDomainObject instanceof Long) {
boolean hasPermission = userRepo.canFind((Long) targetDomainObject);
return hasPermission;
}
return false;
}
}
需要做些什么,以便我可以从
UserRepository
内部获取对PremissionEvaluator
的引用?我尝试了各种变通办法,但都没有成功。似乎没有什么可以将@Autowired
转换为PermissionEvaluator
... 最佳答案
无法将任何东西自动连接到使用new ...()
创建的对象中(除非您使用的是@Configurable
和AspectJ)。因此,几乎可以肯定,您需要将PermissionEvaluator
提取为@Bean
。如果您还需要使其成为惰性代理(由于Spring Security初始化的排序敏感性),则应添加@Lazy @Scope(proxyMode=INTERFACES)
(或TARGET_CLASS
,如果更适合您)。