繁体   English   中英

使用Spring MVC和Spring Security填充基于用户角色的模型

[英]Populating a Model based on User Role with Spring MVC and Spring Security

我在基于Spring Security管理的用户角色的Spring MVC应用程序中填充模型内容时遇到问题。

在我的应用程序(简化示例)中,我定义了两个角色:ROLE_USER和ROLE_ADMIN。 我还有一个页面,显示两个单独的对象列表:读者(仅适用于ADMIN)和书籍(针对ADMIN和USER)。

在JSP页面中有条件显示列表没有问题,但是我需要先准备模型,并且如果当前用户不是ADMIN,也不想加载阅读器列表。

我曾考虑过在Java代码中使用Spring EL来确定用户是否已指定角色(hasRole('ROLE_ADMIN')),但是我找不到手动评估该代码的方法。

有什么方法可以在控制器源代码中调用Spring EL处理程序,或者有一种比在Java代码中直接检查角色更好的解决方案(在体系结构或设计模式级别上)用于有条件地填充模型。

@Chepech和@Boris Kirzner在使用@PreAuthorize Annotation进行的防止异常的方法调用中解决了此问题。 这样,当AccessDeniedException发生时,您可以返回null(在您的情况下为空列表)。

一种方法是在生成模型时只返回所有内容,然后依靠@PostFilter根据角色过滤结果。 如果您不想走这条路,则可以让您的控制器调出另一个bean来构建模型的特定部分,并且另一个bean可以附加角色注释。 如果不使用对象,那将有效地限制您创建对象。

如果有条件地显示页面部件是由JSP页面控制的,则模型的条件填充应由控制器完成(因为JSP页面和Controller在视图层中紧密耦合)。 如果我们在服务层中使用批注,它将把责任放在应用程序的错误层(在服务层而不是视图层)。

我的最终解决方案基于将一组“用户角色”作为用户会话属性:

/* This is executed once, after user successful login. */

Set<String> roles = new HashSet<String>();
for (GrantedAuthority authority : authentication.getAuthorities()) {
   roles.add(authority.getAuthority());
}

session.setAttribute("userRoles", roles);

然后,如果要有条件地填充模型,则只需检查该Set是否包含所需的角色。

Set<String> roles = (Set<String>) session.getAttribute("userRoles");
if(roles.contains("ROLE_ADMIN")) {
    putReadersInModel(model);
}

我认为解决方案是干净的,并负责在Controller中正确填充模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM