基于Acegi权限控制的思路

 权限模型如下:
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页的提示信息

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值