快速业务通道

基于Struts 2拦截器实现细粒度的基于角色的存取控制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
session.get(Constant.KEY_CURRENT_USER);    // Get the user role    String userRole = roleService.findRole(userId, objectType, objectId);    if (!isAllowed(userRole)) {     // forbid invoking the action     return FORBIDDEN;    } else {     // allow invoking the action     return actionInvocation.invoke();    }   }   // Check if the current user has correct role to invoke the action   protected boolean isAllowed(String userRole) {    if (allowedRoles.size() > 0) {     if (userRole == null)      return false;     return allowedRoles.contains(userRole);    } else if (disallowedRoles.size() > 0) {     if (userRole == null)      return true;     return !disallowedRoles.contains(userRole);    }    return true;   } }

基于Struts 2拦截器实现细粒度的基于角色的存取控制(5)

时间:2011-01-30 刘哲

在 intercept 方法中我们根据当前用户的 ID,HTTP 请求参数中获得资源的 ID,所存取的资源类型来调用 RoleService 获得用户的角色。 然后再判断该角色是否在 allowedRoles 和 disallowedRoles 中来确定用户是否有权限调用 Action 。如果用户没权限,则将请求发送到名为“forbidden”的 result 。从这里可以看出,用户的角色验证与身份验证的作用完全不同。身份验证是验证用户是否网站注册用户,而角色认证是在用户为注册用户的前提下对用户相对于站内各种资源扮演的角色的辨别。

上面代码中用到了判断用户是否具有运行 Action 所要求的角色的函数 isAllowed()。它首先根据用户 ID 和 Action 作用于的对象的类型和 ID 从数据库查询到用户对应的角色,然后将用户角色与允许角色的列表逐个比较。如果允许角色列表包含用户实际角色则返回真,否则返回假;如果允许角色列表为空,则将用户角色与禁止角色的列表比较,如果用户的角色被禁止,则返回假,否则返回真。如果两个列表都为空,也返回真。这样既可以对某个 Action 配置允许访问角色列表,也可以配置拒绝访问列表。

使用

首先我需要在 Spring 的配置文件中添加系统中所涉及到各个 POJO,如清单 7 。

清单 7

<!-- Data Access Objects -->   <bean id="userRoleDao" class="com.sample.security.dao.impl.UserRoleDaoImpl"/>   <!-- Service Objects -->   <bean id="roleService"    class="com. sample.security.service.impl.RoleServiceImpl" >    <property name="userRoleDao" ref="userRoleDao" />   </bean>   <!-- Interceptor Objects -->   <bean id="RBACInterceptor" scope="prototype"    class="com. sample.security.interceptor. RBACInterceptor ">    <property name="roleService" ref="roleService" />   </bean>

然后需要在 Struts 配置文件中对需要进行存取控制的 Action 进行配置。首先定义我们实现的拦截器,并把其加到拦截器栈中。在 <interceptors> …… </interceptors> 中添加下面的代码。

<interceptor name="RBAC ” class="RBACInterceptor" />

现在我们可以将 RBAC 拦截器添加到任意的 interceptor-stack 中,或者直接配置到任意的 Action 。添加下面清单中的内容到 Struts 2 配置文件中,将能够对在一个日程表中删除会议进行控制。

清单 8

&

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号