快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
this.objectType = objectType;   }   public Long getObjectId() {    return objectId;   }   public void setObjectId(Long objectId) {    this.objectId = objectId;   }   public String getRole() {    return role;   }   public void setRole(String role) {    this.role = role;   } }

注意这里边有两个比较特殊的字段 objectType 和 objectId,它们用来表明用户在具体哪个资源上拥有的角色。 objectType 指资源的类型,objectId 指资源的标识。比如我们要将用户 Mike 加为某个日程表的管理员,则表中新增记录的 user 字段为 Mike 在 user 表中的 ID,objectType 为“calendar”,objectID 为这个日程表 ID,role 为角色的名字“admin”。当然,如果您的应用中不同类型资源都使用唯一的全局 ID,objectType 这个字段也可以省略。

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

时间:2011-01-30 刘哲

DAO 层实现

代码清单 2 定义了对 UserRole 进行 CRUD 的 DAO 接口,代码清单 3 则是它的实现。通过 @PersistenceContext 注解来让容器注入 JPA 中的实体管理器 EntityManager 。 UserRoleDaoImpl 调用 EntityManager 来对 UserRole 进行持久化到数据库中。

清单 2

public interface UserRoleDao { public void create(UserRole userRole); public void update(UserRole userRole); public UserRole find(Long userId, String objectType, Long objectId); }

清单 3

public class UserRoleDaoImpl implements UserRoleDao {   private EntityManager entityManager;   public EntityManager getEntityManager() {    return entityManager;   }   @PersistenceContext   public void setEntityManager(EntityManager entityManager) {    this.entityManager = entityManager;   }   public void create(UserRole userRole) {    entityManager.persist(userRole);   }   public UserRole find(Long userId, String objectType, Long objectId) {    Query query = entityManager.createQuery(     "FROM UserRole ur WHERE ur.user.id=" +     userId +     " AND ur.objectType=''" +     objectType +     "'' AND ur.objectId=" +     objectId);    List result = query.getResultList();    if (result.size() == 0)     return null;    return (UserRole)result.get(0);   }   public void update(UserRole userRole) {    entityManager.merge(userRole);   } }

服务层实现

创建一个 RoleService 接口 (清单 4) 作为 façade, 清单 5 是具体实现。 RoleServiceImpl 的实现很简单,主要是封装了为用户分配角色和查询用户角色。注解 Transactional 用来将方法放置在一个事务中进行。在类声明上的 @Transactional(readOnly = true) 表示默认的事务为只读。 setUserRole 方法需要写入数据到数据库中,因此我们将其 readOnly 属性设置成 false.

清单 4

public interface RoleService {   public void setUserRole(Long userId, String role, String objectType, Long objectId);   public String findRole(Long userId, String objectType, Long objectId); }

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

时间:2011-01-30 刘哲

清单 5

@Transactional(readOnly = true) public class RoleServiceImpl implements RoleService { private UserRoleDao userRoleDao; public void setUserRoleDao(UserRoleDao userRoleDao) {  

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