gpt4 book ai didi

spring - Spring PermissionEvaluator 中的@Autowired

转载 作者:行者123 更新时间:2023-12-04 13:11:32 25 4
gpt4 key购买 nike

首先,我在 Google 上进行了广泛的搜索,虽然看起来应该有一个修复程序,但我无法成功引用注入(inject)的 @Bean PermissionEvaluator 的内部:

https://jira.springsource.org/browse/SEC-2136?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

在该问题的评论部分,Rob Winch 提供了一个解决建议

to work around this issue, you can proxy your permissionEvaluator using LazyInitTargetSource



话虽如此,我在实现发布的 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 ...

最佳答案

没有任何东西可以 Autowiring 到使用 new ...() 创建的对象中。 (除非您使用 @Configurable 和 AspectJ)。所以你几乎肯定需要拉你的PermissionEvaluator进入@Bean .如果你还需要让它成为一个惰性代理(因为 Spring Security 初始化的排序敏感),那么你应该添加 @Lazy @Scope(proxyMode=INTERFACES) (或 TARGET_CLASS 如果更适合您)。

关于spring - Spring PermissionEvaluator 中的@Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21866905/

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