@PreAuthorize Controller使@InitBinder

时间:2015-10-16 15:39:03

标签: spring spring-mvc spring-security spring-validator

在一个简单的控制器中:

@PreAuthorize("hasAuthority('USER')")
@Controller
@RequestMapping("/test")
public class TestController {

  private Logger logger = LoggerFactory.getLogger(getClass());

  @Inject
  private MyValidator myValidator;

  @InitBinder("myObj")
  private void initBinder(WebDataBinder binder) {
    logger.info("myValidator = {}", myValidator);
    binder.initDirectFieldAccess();
    binder.setValidator(myValidator);
  }

  @RequestMapping(value = "/doPost", method = RequestMethod.POST)
  public String doPost(MyObj myObj , BindingResult br ) throws IOException {
    logger.info("myObj = {} , bindingResult = {}" , myObj , br);
    return "redirect:/test/form";
  }
}

我注意到注入的验证器在initBinder方法中始终为空,记录器甚至为空(并抛出NPE),这很奇怪。

如果我完全删除了@InitBinder initBinder()方法,则myValidator在每种方法中都可用(非空)。

在消除了许多因素后,我发现罪魁祸首是@PreAuthorize("hasAuthority('USER')")。删除此@PreAuthorize后,一切正常。

这是一个错误吗?是否存在与SpringSecurity,SpringValidation和SpringMVC冲突的内容?

如何解决?

环境:

<spring.version>4.2.1.RELEASE</spring.version>
<springboot.version>1.3.0.M5</springboot.version>
<spring-security.version>4.0.2.RELEASE</spring-security.version>

先谢谢。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是为myValidator创建一个setter方法。然后在应用初始化时调用此setter。对所有被@PreAuthorize标记无效的注射剂执行此操作。