允许Spring Security中的特定用户访问

时间:2015-01-23 08:53:43

标签: java spring spring-mvc spring-security

我使用Spring Security来保护我的Web应用程序。 我有一个页面,我为管理员显示foo个对象。

<intercept-url pattern="/show_foo/**" access="hasRole('ROLE_ADMIN')" />

但是现在我要求所有管理员都看不到foo,例如只有管理员使用city =&#34;纽约&#34;可以访问元素。

我已经在我的控制器中做了一些事来解决这个问题:

@RequestMapping(method=RequestMethod.GET,value="/show_foo"
public ModelAndView showfunction(Principal user)
{
User user2 = userService.getUserByName(user.getName());
if(/* some checks on user2 */)
   /* show page */
else
  /* show error page*/
} 

所以我的问题是:我可以避免数据库调用,因为我几乎在我的所有页面中都需要它,并且我发现每次在任何控制器的顶部检查一遍又一遍都很难看。这种用例是否有Spring Security功能?

3 个答案:

答案 0 :(得分:3)

使用基于表达式的规则,您甚至可以在规则上访问委托人。请参阅:http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html

例如,如果您可以包含关于主要对象的所需信息。

<intercept-url pattern="/show_foo/**" access="hasRole('ROLE_ADMIN') and principal.name=='xyzzy' " />

答案 1 :(得分:1)

你必须加入一些逻辑。

1。)加载用户和国家/地区映射并存储在Static HashMap中的某个地方,如果在映射中进行了任何更改,请记住更新地图,可以在会话级别存储相同内容。

2.。)在2nd level cache,中加载条目或使查询可缓存,同时启用query caching

答案 2 :(得分:1)

您需要将Spring Security与Domain-ACL集成。请参阅完整说明here

Yo可以考虑使用管理员和城市之间的关系进行映射 ACL_OBJECT_IDENTITY个实例。