2011-04-22 48 views
1

我有填充在Spring MVC应用程序中的模型内容的基础上,由春季安全管理用户角色的问题,用户角色模型。填充基于与Spring MVC和Spring Security的

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

有在JSP页面中有条件地显示表没有问题,但我需要先准备好模型,我不希望加载读者名单,如果当前用户不是ADMIN。我想过在Java代码中使用Spring EL来确定用户是否指定角色(hasRole('ROLE_ADMIN')),但我找不到手动评估该代码的方法。

是否有某种方式来调用春EL处理程序控制器的源代码,或者可能存在有条件地填充模型,不是在Java代码中直接检查角色更好的解决方案(在建筑或设计模式级)。

回答

-1

如果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<String> roles = (Set<String>) session.getAttribute("userRoles"); 
if(roles.contains("ROLE_ADMIN")) { 
    putReadersInModel(model); 
} 

我认为解决方案是干净的,并保持模型在控制器中正确填充的责任。

0

一种方法是只返回的一切,当你生成你的模型,然后依靠@PostFilter过滤基于角色的结果。如果你不想走这条路线,你可以让你的控制器调用另一个bean来构建模型的特定部分,而另一个bean可以附加角色注释。如果它们不被使用,这将有效地限制你创建对象。

+0

感谢您的建议。不幸的是,你的解决方案都有缺陷,首先在性能上下文中存在问题,其次,对注释方法的调用将导致安全异常,这不是控制程序流的最明显的方式。虽然他们都会提供所需的效果,但我正在寻找更清洁的解决方案。 – 2011-04-22 18:45:26

+0

我认为这将是很好的注释,如果用户没有正确的权限,它会导致方法返回一个预定义的值(在我的情况下是一个空列表),而不执行该方法体。但那只是一厢情愿的想法;) – 2011-04-22 18:51:03