我使用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功能?
答案 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
个实例。