Spring-Boot @PreAuthorize 仅允许对管理员进行操作,或者如果经过身份验证的用户 ID 与路径参数 ID 相同
Spring-Boot @PreAuthorize allow operation only for admin or if the authenticated user id is same as path parameter id
我有一个具有用户 CRUD 操作的控制器。
@Controller
public class UserController {
// @TODO need to check whether userId == authUser.id or authUser is admin??
//
@PreAuthorize("hasRole('ROLE_ADMIN) or ...???...")
@PostMapping("/user/{id}/edit")
public boolean editUser(@PathVariable("id") long userId,
@RequestBody User newUserObj,
@CurrentUser authUser) {
// I don't like to always call a helper function from here
// check(authUser.getId() == userId);
return userService.edit(userId, newUserObj);
}
// ... rest of the methods
}
此操作仅允许管理员或用户him/herself使用。任何用户都不能编辑任何其他用户的个人资料。
我试过@PreAuthorize("hasRole('ROLE_ADMIN'))
,它只适用于管理员用户,但我想检查经过身份验证的用户是否与参数userId
(authUser.getId() == userId
)指示的用户相同.我如何在注释中定义这个表达式?这是否可以不编写辅助函数。
我还使用 @CurrentUser
注释将当前经过身份验证的用户注入到控制器方法中,以备不时之需。
Spring 文档在这里应该会有帮助。
https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html
您可以在表达式和方法参数中访问主体或身份验证对象。所以你在这里有几个选项,其中之一如下所示:
@PreAuthorize("hasRole('ROLE_ADMIN) or #authUser.id == #userId")
我有一个具有用户 CRUD 操作的控制器。
@Controller
public class UserController {
// @TODO need to check whether userId == authUser.id or authUser is admin??
//
@PreAuthorize("hasRole('ROLE_ADMIN) or ...???...")
@PostMapping("/user/{id}/edit")
public boolean editUser(@PathVariable("id") long userId,
@RequestBody User newUserObj,
@CurrentUser authUser) {
// I don't like to always call a helper function from here
// check(authUser.getId() == userId);
return userService.edit(userId, newUserObj);
}
// ... rest of the methods
}
此操作仅允许管理员或用户him/herself使用。任何用户都不能编辑任何其他用户的个人资料。
我试过@PreAuthorize("hasRole('ROLE_ADMIN'))
,它只适用于管理员用户,但我想检查经过身份验证的用户是否与参数userId
(authUser.getId() == userId
)指示的用户相同.我如何在注释中定义这个表达式?这是否可以不编写辅助函数。
我还使用 @CurrentUser
注释将当前经过身份验证的用户注入到控制器方法中,以备不时之需。
Spring 文档在这里应该会有帮助。 https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html
您可以在表达式和方法参数中访问主体或身份验证对象。所以你在这里有几个选项,其中之一如下所示:
@PreAuthorize("hasRole('ROLE_ADMIN) or #authUser.id == #userId")