在 Spring 3 控制器中,如何检查登录用户的权限并有条件地执行某些操作?

Posted

技术标签:

【中文标题】在 Spring 3 控制器中,如何检查登录用户的权限并有条件地执行某些操作?【英文标题】:In a Spring 3 controller, how can I check the permissions of the logged-in user and do certain actions conditionally? 【发布时间】:2011-09-22 10:31:45 【问题描述】:

在 Spring 3 中,是否有一种方法可以接受以逗号分隔的权限列表并返回登录用户是否具有这些权限的布尔值?我设想做类似的事情:

if(loggedInUserHasAnyOfThesePermissions("PERMISSION_READ,PERMISSION_EDIT"))
    //do stuff

目前,由于不知道任何此类内置方法,我正在这样做:

Set<String> permissions = new HashSet();
for (GrantedAuthority auth : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) 
    permissions.add(auth.getAuthority());


if (permissions.contains("PERMISSION_READ") || permissions.contains("PERMISSION_EDIT")) 
    //do stuff

我已经搜索了几个小时,但没有找到一种更简洁优雅的方法,但必须存在。感谢您的帮助!

附:我已经熟悉如何在 JSP 中像这样处理权限:(how to conditionally show jsp content to logged in users with Spring security)但我现在需要的是一种在控制器内进行检查的方法。

【问题讨论】:

【参考方案1】:

HttpServletRequest 有一个方法isUserInRole,可能有用。示例:

public String someControllerMethod(HttpServletRequest request, ...) 
   boolean read = request.isUserInRole("PERMISSION_READ");
   ...

【讨论】:

【参考方案2】:

在 Spring 3 中,是否有一种方法可以接受以逗号分隔的权限列表并返回登录用户是否具有这些权限的布尔值?

没有。

我最终定义并实现了自己的便利 API 来做这种事情。

【讨论】:

【参考方案3】:

您可以使用Spring security,而不是使用在方法级别上运行的Pre and Post Annotations。

pre a post 注释背后的实际逻辑可能是可访问的,因此您可能可以完成您想要的。

【讨论】:

【参考方案4】:

在 Spring 3 中,是否有一种方法可以接受以逗号分隔的权限列表并返回登录用户是否具有这些权限的布尔值?

您是在说ExpressionUtils 可以评估表达式,例如hasAnyRole([role1,role2])

【讨论】:

也许吧,但我不知道你在说什么/提议什么。我该怎么做?谢谢。 @Ryan 我猜在其他论坛上也有人问过是否可以使用 ExpressionUtils 优雅地做同样的事情。它具有接受表达式并返回布尔值的 evaluateAsBoolean 方法。它在 Spring 类中使用,但我想知道我们是否可以在应用程序类中使用类似的方法。【参考方案5】:

我最终编写了自己的类:MyUserDetails 类有多种方法,包括一种迭代角色和权限以查看用户拥有的所有权限的方法,例如:

for (Permission permission : role.getPermissions()) 
          permissions.add(new GrantedAuthorityImpl(permission.getName()));
        

这很丑,但我还没有更好的方法。

我通过执行以下操作来使用它:

MyUser loggedInUser = myUserDAO.getByUsername(principal.getName());
MyUserDetails loggedInUserUD = new MyUserDetails(loggedInUser);
if (loggedInUserUD.hasAnyPermission("perm1, perm2"))
//do stuff

【讨论】:

以上是关于在 Spring 3 控制器中,如何检查登录用户的权限并有条件地执行某些操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 中使用 Spring Security 检查用户在线状态?

如何使用 MVC 5 在基于令牌的身份验证中检查用户是不是从控制器登录?

如何在 Spring Security 3.1 中进行没有身份验证和授权的并发会话控制

我想根据登录用户更改主页菜单。我如何在 Spring MVC 中做到这一点?

使用 spring 3.0 进行用户身份验证

使用 Firebase 和 Swift 3 检查用户登录状态并加载基于它的视图控制器