私はスプリング ブートを使用しており、WebSecurityConfigurerAdapter でグローバル メソッド セキュリティを有効にしています。
@EnableGlobalMethodSecurity(prePostEnabled = true, order = Ordered.HIGHEST_PRECEDENCE)
そして以下は私のコントローラーコードです
@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 リクエストを実行しようとすると、@PreAuthorize の前に JSR303 バリデーターが作動します。たとえば、管理者以外のユーザーは、「アクセスが拒否されました」ではなく「名が必要です」などのメッセージを受け取りました。しかし、ユーザーがバリデータを渡すために最初の名前変数を指定した後、アクセス拒否が返されました。
@Valid または @Validated の前に @PreAuthorize を強制的にチェックする方法を知っている人はいますか?
また、複雑なルール チェックを実行するには、URL ベースの承認ではなく、この種のメソッド レベルの承認を使用する必要があります。