快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
 this.userRoleDao = userRoleDao; }  @Transactional(readOnly = false)  public void setUserRole(Long userId, String role, String objectType, Long objectId) {   UserRole userRole = new UserRole(userId, role, objectType, objectId);   UserRole userRoleInDB = userRoleDao.find(userId, objectType, objectId);   if (null == userRoleInDB) {    userRoleDao.create(userRole);   } else {    userRole.setId(userRoleInDB.getId());    userRoleDao.update(userRole);   }  }  public String findRole(Long userId, String objectType, Long objectId) {   UserRole userRole = userRoleDao.find(userId, objectType, objectId);   if (userRole == null) {    return null;   }   return userRole.getRole();  } }

拦截器的实现

拦截器会在 Action 被执行之前被 Struts 2 框架所调用,我们利用这个特性来完成对用户身份的认证,只有用户具有正确角色方能执行 Action 。具体哪些角色可以执行 Action,需要在 Struts 2 的配置文件中指定,将在下一小节中详细阐述。这一点和 Struts 2 内置的 RolesInterceptor 类似,但我们的拦截器可以通过 objectType 和 objectId 来实现更加细粒度的认证。

要创建一个用于用户角色认证的拦截器。需要让其实现 com.opensymphony.xwork2.interceptor.Interceptor 接口并对 String intercept(ActionInvocation actionInvocation) throws Exception 方法进行实现。 如清单 6 。成员变量 roleService 是通过 Spring 的依赖注入被赋予 RoleServiceImpl 。 allowedRoles 和 disallowedRoles 分别存储了允许和不允许执行 Action 的角色,两者不能同时存在。 objectType 和 objectIdKey 分别表示资源的类型和资源 ID 在 HTTP 请求中的参数名。它们是做为 Interceptor 的参数在 Struts 2 配置文件中进行设置,会自动由 Struts 2 框架填充进来。

清单 6

public class RBACInterceptor implements Interceptor {   public static final String FORBIDDEN = "forbidden";   private List<String> allowedRoles = new ArrayList<String>();   private List<String> disallowedRoles = new ArrayList<String>();   private RoleService roleService;   private String objectType;   private String objectIdKey;    public void setRoleService(RoleService roleService) {   this.roleService = roleService;   }   public void setObjectType(String objectType) {    this.objectType = objectType;   }   public void setObjectIdKey(String objectIdKey) {    this.objectIdKey = objectIdKey;   }   public void setAllowedRoles(String roles) {    if (roles != null)     allowedRoles = Arrays.asList(roles.split("[ ]*,[ ]*"));   }   public void setDisallowedRoles(String roles) {    if (roles != null)     disallowedRoles = Arrays.asList(roles.split("[ ]*,[ ]*"));   }   public void init() {   }   public void destroy() {   }   public String intercept(ActionInvocation actionInvocation) throws Exception {    HttpServletRequest request = ServletActionContext.getRequest();    // Get object id    Long objectId = Long.valueOf(request.getParameter(objectIdKey));    Map session = actionInvocation.getInvocationContext().getSession();    // Get current user id    Long userId = (Long)

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号