我想在我的Spring应用程序的授权过程中添加一些业务逻辑,我认为实现自定义AccessDecisionVoter是最佳解决方案。
那会很棒,但我还没有找到任何办法将这个新的选民添加到授权过程而不完全重新定义AccessDecisionManager bean。这非常不方便,因为我的业务逻辑应该透明地添加,并且不需要任何特定的决策管理器。相反,它应该只告诉他的意见(投票),并让封闭的应用程序应用自己的授权政策。
即使是Spring security的建议示例(https://spring.io/blog/2009/01/03/spring-security-customization-part-2-adjusting-secured-session-in-real-time)也使用了这种方法。
我在http://forum.spring.io/forum/spring-projects/security/109476-how-to-add-voters-to-the-default-accessdecisionmanager?p=570570#post570570找到了一个有效的解决方案,它可能会使用bean后处理器向任何AbstractAccessDecisionManager添加额外的选民,但方法setDecisionVoters(此类解决方案的关键)已弃用,因此它已被弃用毫无疑问。
所以,我想知道是否有某种方法可以将我的选民添加到当前的AccessDecisionManager而无需处理它。有什么想法吗?
答案 0 :(得分:0)
@Component
public class AccessDecisionManagerCustomizer {
@Autowired protected MethodInterceptor methodSecurityInterceptor;
@PostConstruct
public void init() {
if (methodSecurityInterceptor instanceof MethodSecurityInterceptor) {
AccessDecisionManager accessDecisionManager = ((MethodSecurityInterceptor) methodSecurityInterceptor).getAccessDecisionManager();
if (accessDecisionManager instanceof AbstractAccessDecisionManager) {
List<AccessDecisionVoter<? extends Object>> voters = ((AbstractAccessDecisionManager) accessDecisionManager).getDecisionVoters();
// do something with voters
} else
throw new IllegalStateException(String.format("Access decision manager is of: %s, can't register custom voter",
accessDecisionManager.getClass().getSimpleName()));
} else
throw new IllegalStateException(String.format("Method security interceptor is of: %s, can't register custom voter",
methodSecurityInterceptor.getClass().getSimpleName()));
}
}
答案 1 :(得分:-1)
AfirmativeBean扩展AbstractAccessDecisionManager。只需使用getDecisionVoters()并在列表中添加一个
AfirmativeBean afirmativeBean = (AfirmativeBean)bean);
afirmativeBean.getDecisionVoters().add(yourvoter);