权限模型如下:
1.资源表:用来存储希望权限系统保护起来的东西。例如URL,方法(增、删、改、查等) ,也就是RBAC模型里说的“目标objects(OBS)”
2.角色表:用户分类。
3.角色-资源对照表:角色所允许操作的资源。
4.用户表:具体的登录系统的用户帐户信息。
5.角色-用户对照表:用户所属的角色。一个用户可有多个角色。
6.功能菜单表:系统中允许操作的功能模块列表;列表中所列举的功能,除资源表中保护的外,均可直接使用。
7.角色-菜单对照表:角色所允许操作的功能菜单列表;
8.其它表:例如用户微调表、角色组等
URL的控制基于HttpRequest拦截器(SS2里是filterSecurityInterceptor),用户每点击一个URL,先由权限系统判断该URL是否已被授权允许该用户访问,若未被授权,由抛出"未授权"异常,在操作界面捕获该异常并将提示信息显示出来。
方法的控制基于AOP实现,MethodSecurityIntercept。
参考:http://www.javaeye.com/topic/319965
1.将所有需要保护的URL做为权限资源保存起来。这个是必须的。
2.对方法类资源的保护的实现方式如下:
下面以用户信息的CRUD(增删改查)为例描述
(1).仍然是基于SS2,以AOP方式实现,核心是其MethodSecurityIntercept
(2).程序框架为MVC架构,例如 struts2的Action + 业务逻辑层的service(可能还有接口层) + hibernate的DAO
这三层通过spring来组装调用。业务层的service类是关键,AOP主要针对该层。
(3).配置SS2的AOP,拦截业务层的service类的具体执行方法;
(4).在权限模块的资源信息表中增加对CRUD方法信息,以对其保护
yourpacketname.youServiceClass.ClassName
要使功能强大些,可使用通配符,例如:yourpacketname.youServiceClass.do*
这需要在资源信息判断时做些处理。
(5).JSP界面,例如用户列表页有“删除”按钮,通过调用struts的action,相应的执行 yourpacketname.youServiceClass.UserInfoManager.delete(U)方法
打开用户列表页,允许操作人员点击“删除”按钮,客户端发出请求后,由SS2相应的判断该操作人是否具有执行delete(U)方法的权限。
若没有权限,会抛出AccessDenied之类的异常。由action层tyr..catch..后在JSP页以弹出信息的方式提示:未获授权进行此项操作。
(6).总结:
对方法的权限控制,是等到该方法被执行时进行判断。
若想不使用硬编码实现操作界面JSP可根据权限设置某些功能按钮禁用或可用状态,目前还没想到什么好的办法。欢迎各位大侠拍砖。
(7).其它说明:
不能对struts.Action方法进行拦截,会报错。
不能对纯JSP的<%! public XXX(){...} %>这类方法拦截。
(8).具体示例代码如下:
用户信息管理Service:
SS2的AOP配置
这个pointcut可以根据实际代码配置,支持通配符,例如:execution(* com.yourcompany.service..*.*(..))
JSP页的提示信息