我的自定义Spring Security PermissionEvaluator有问题。所以, CustomPermissionEvaluator需要该服务才能完成其工作。
@Service
public class MyService {
// methods....
}
以下是评估员本身。
public class CustomPermissionEvaluator implements PermissionEvaluator {
private MyService service;
public CustromPermissionEvaluator( MyService service ) {
this.service = service;
}
// hasPermission methods...
}
这里的配置
@Configuration
@EnableGlobalMethodSecurity( prePostEnabled = true )
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
@Autowired
private MyService service;
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
CustomPermissionEvaluator permissionEvaluator = new CustomPermissionEvaluator( service );
DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
expressionHandler.setPermissionEvaluator( permissionEvaluator );
return expressionHandler;
}
}
因此,当应该调用@PreAuthorize(" hasPermission(...)")时,没有任何反应。但是,当我将该依赖项直接放到CustomPermissionEvaluator的构造函数中时,没有ApplicationContext和自动装配,一切都很完美。我已将服务对象打印到日志文件,它不是null。那么,有什么不对?
答案 0 :(得分:1)
我遇到了同样的问题,不得不使用@Lazy
注释:
@Lazy @Autowired
private MyService service;
看起来安全内容在Spring配置的其余部分之前被引导。我猜@Lazy
允许注入引用,但在使用之前不会实际解析。
答案 1 :(得分:0)
花费数小时之后,这是唯一为我工作的解决方案。谢谢@hvgotcodes。
所以我所做的是 用@component注释CustomPermissionEvaluator。 并用@Lazy @Autowired注释MyService
@Component
Class CustomPermissionEvaluator {
@Lazy @Autowired
private MyService service;
}
如果我在配置MethodSecurityConfiguration中使用@Lazy @Autowired
,那么它将无法正常工作