Spring Security自定义PermissionEvaluator配置无法正常运行

时间:2015-01-25 17:34:20

标签: spring security configuration autowired access-control

我的自定义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。那么,有什么不对?

2 个答案:

答案 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,那么它将无法正常工作