spring-mvc - 如何使@PreAuthorize 具有比@Valid 或@Validated 更高的优先级

标签 spring-mvc spring-security controller bean-validation role-base-authorization

我正在使用spring boot,并且我在WebSecurityConfigurerAdapter中启用了全局方法安全性

@EnableGlobalMethodSecurity(prePostEnabled = true, order = Ordered.HIGHEST_PRECEDENCE) 

下面是我的 Controller 代码
@PreAuthorize("hasAnyRole('admin') or principal.id == id")
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public User updateUser(@PathVariable("id") String id,  @Valid @RequestBody   UserDto userDto) 
{ ....}

但是,当非管理员用户尝试执行 PUT 请求时,JSR303 验证器将在 @PreAuthorize 之前启动。
例如,非管理员用户最终会得到类似“需要名字”而不是“拒绝访问”的内容。但是在用户提供名字变量以通过验证器后,拒绝访问被返回。

有谁知道如何在@Valid 或@Validated 之前强制检查@PreAuthorize?

而且我必须使用这种方法级别的授权而不是基于 url 的授权来执行一些复杂的规则检查。

最佳答案

我有同样的问题,我找到了这篇文章。 M. Deinum 的评论帮助我理解出了什么问题

这是我所做的:

  • 公共(public)方法有@PreAuthorize 并检查
  • @RequestBody 参数上没有@Valid
  • 我创建了第二种方法,私有(private)的,我在其中进行 DTO 验证。使用@Valid 注解
  • 公共(public)方法将调用委托(delegate)给私有(private)方法。私有(private)方法只被调用,公有方法被授权

  • 例子 :
    @RequestMapping(method = RequestMethod.POST)
    @PreAuthorize("hasRole('MY_ROLE')")
    public ResponseEntity createNewMessage(@RequestBody CreateMessageDTO createMessageDTO) {
        // The user is authorized
        return createNewMessageWithValidation(createMessageDTO);
    }
    
    private ResponseEntity createNewMessageWithValidation(@Valid CreateMessageDTO createMessageDTO) {
       // The DTO is valid
       return ...
    }
    

    关于spring-mvc - 如何使@PreAuthorize 具有比@Valid 或@Validated 更高的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28923360/

    相关文章:

    java - 从 Spring Controller 进行异步调用会出现错误

    java - 您如何设计一个不全是 try/catch block 的服务层?

    spring-mvc - Spring MVC 的 @Async、DeferredResult 和 Callable 的区别

    java - Spring boot AuthenticationSuccessHandler 被忽略

    java - 使用 XML 配置的 Spring Security 不会对用户进行身份验证

    java - Spring OAuth2授权: Access Denied

    javascript - 如何将 GET 请求转换为 POST

    javascript - AngularJS 指令要求父指令不起作用

    ruby-on-rails - rails : Pass parameter from view to controller

    java - Spring MVC请求映射冲突