在我的Spring Boot应用程序中,我有一个REST控制器,它有以下方法:
@PreAuthorize("hasAnyRole('PERMISSION_UPDATE_OWN_COMMENT', 'PERMISSION_UPDATE_ANY_COMMENT')")
@RequestMapping(value = "/update", method = RequestMethod.POST)
public CommentResponse updateComment(@AuthenticationPrincipal User user, @Valid @RequestBody UpdateCommentRequest commentRequest) {
Comment comment = commentService.updateComment(commentRequest.getCommentId(), commentRequest.getTitle(), commentRequest.getContent(), user);
return new CommentResponse(comment);
}
只允许使用PERMISSION_UPDATE_OWN_COMMENT
或PERMISSION_UPDATE_ANY_COMMENT
的用户使用此端点。
在此方法的内部,我需要创建两个不同的流 - 一个用于PERMISSION_UPDATE_OWN_COMMENT
的用户,另一个用于具有PERMISSION_UPDATE_ANY_COMMENT
权限的用户。
所以我的问题是 - 为了在单个方法中实现这些不同的逻辑流程,Spring安全性的最佳实践是什么?
我应该在updateComment
方法内部验证用户是否拥有一个或另一个权限,并根据此条件实现我的逻辑?
答案 0 :(得分:3)
最简单的方法是在控制器内部执行updateComment函数内部的逻辑。因为,您可以轻松地从操作参数中获取SecurityContextHolderAwareRequestWrapper
的实例以查找角色。
但最佳做法是将您的逻辑置于服务中。这将使您的生活更容易在RESTFul APIs
等其他地方重用逻辑。
因此,您可以使用以下代码或类似内容来检查服务中的角色。
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean authorized = authorities.contains(new SimpleGrantedAuthority("PERMISSION_UPDATE_OWN_COMMENT"));
(已编辑并提供更多信息)
完整功能,可用于检查roles
protected boolean roleExist(String role) {
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
for (GrantedAuthority auth : authentication.getAuthorities()) {
if (role.equals(auth.getAuthority()))
return true;
}
return false;
}