gpt4 book ai didi

java - 如何将选民添加到默认的 AccessDecisionManager?

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:46 28 4
gpt4 key购买 nike

我想在我的 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 而无需处理它。有什么想法吗?

最佳答案

@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()));

}

}

关于java - 如何将选民添加到默认的 AccessDecisionManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973526/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com