Spring安全性具有AnyRole和不同权限的不同流

时间:2015-04-01 18:20:59

标签: spring spring-security

在我的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_COMMENTPERMISSION_UPDATE_ANY_COMMENT的用户使用此端点。

在此方法的内部,我需要创建两个不同的流 - 一个用于PERMISSION_UPDATE_OWN_COMMENT的用户,另一个用于具有PERMISSION_UPDATE_ANY_COMMENT权限的用户。

所以我的问题是 - 为了在单个方法中实现这些不同的逻辑流程,Spring安全性的最佳实践是什么?

我应该在updateComment方法内部验证用户是否拥有一个或另一个权限,并根据此条件实现我的逻辑?

1 个答案:

答案 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;
}