[英]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.