程序员的资源宝库

网站首页 > gitee 正文

办公自动化(OA)————权限管理————SSH

sanyeah 2024-03-31 12:33:11 gitee 6 ℃ 0 评论

 

本文包含主要内容:在数据库,操作系统中都用到的权限管理方式——用户角色

写本文的目的:根着老师一起做OA系统,总结一下开发过程中值得注意和应用的知识点

文章分类:学习总结

读者类型:熟悉JAVASSH相关知识

主要参考:陈涛老师课堂授课及代码

学科类别:JAVA WEB开发

       这是一个功能完善的办公系统,包括的主要功能有,

       登陆系统,系统根据不同人的身份出现他可以操作的模块。用户可以对保个模块进行管理。权限管理是许多系统中的一个安全问题,本系统采用了用户角色管理方式:我们给不同的角色赋予不同的权力,然后把角色分配给用户,用户根据自己的权利有合法的操作

              1 ,用ACL来定义权限,在数据库中存储权限

           我们是用角色来管理用户的权限,因此我们只需要给角色赋于权限。定义ACL类来管理权限,

public class ACL {

    private int id;//ACL的主键

    private String principalType; // 主体类型 角色

    private int principalSn; // 主体标识   角色id

    private int resourceSn; // 资源标识 模块id

       // 授权状态 用后四位bit 来表示 c创建r读取u修改d删除

private int aclState;

//设置根除,permission取值 0 1 2 3 设置aclState的每一位

    public void setPermission(int permission,boolean yes){

       int tmp = 1;

       tmp = tmp << permission;

       if(yes == true){

           aclState += tmp;

       }else{

           aclState ^= tmp;

       }

    }

    //得到每一位的权限:如果那一位上允许我们返回一,否则返回0

    public int getPermission(int permission){

       int tmp = 1;

       tmp = tmp << permission;

       tmp &= aclState;

       if(tmp != 0){

           return 1;

       }

       return 0;

    }

}

        2 存取管理权限

public class ACLManagerImpl extends AbstractManager implements IACLManager{

    public void addOrUpdatePermission(String principalType, int principalSn}//保存或更新权限,

    public void delPermission(String principalType, int principalSn, int resourceSn) //删除权限

    public boolean hasPermission(int userId, int resourceSn, int permission) 某个用户对某个资源是否有某项权力

    public List searchModules(int userId) {

       Map temp = new HashMap();

//根据用户的ID,以及UsersRolesG表的记录,得到以ID用户的所有角色编号

       String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u where u.id = ? order by ur.orderNo desc";

       List aclIds =getSession()

       .createQuery(hql)

       .setParameter(0, userId)

       .list();

//根据角色编号,得到所有的的权限列表ACL

       for(Iterator it = aclIds.iterator();it.hasNext();){

           Integer rid = (Integer)it.next();

           List<ACL> acls =

              getSession().createQuery("select acl from ACL acl where acl.principalType = ? and acl.principalSn = ?")

              .setParameter(0, ACL.TYPE_ROLE)

              .setParameter(1, rid)

              .list();

          

       //把权限的资源编号取出放到TEMP中,重复的被过滤出去

           for(Iterator<ACL> its = acls.iterator();its.hasNext();){

              ACL acl = (ACL)its.next();

              temp.put(acl.getResourceSn(), acl);

           }

       }

/      //对于有些资源,用户不能读,所以我们要把他从,MAP中删除

       List delReources = new ArrayList();

       //将所有map key value返回

       Set entries = temp.entrySet();

       for(Iterator it = entries.iterator();it.hasNext();){

           Map.Entry entry = (Map.Entry)it.next();

           ACL acl = (ACL)entry.getValue();

           if(acl.getPermission(Permission.READ) == ACL.ACL_NO){

              delReources.add(entry.getKey());

           }

       }

       for(Iterator it = delReources.iterator();it.hasNext();){

           Object key = (Object)it.next();

           temp.remove(key);

       }

    //如果MAP中被删除完,我们就返回空的LIST

       if(temp.isEmpty()){

           return new ArrayList();

       }

//MAP中还有值,我们就返回以MAP中的资源

       String searchModules = "select m from Module m where m.id in(:ids)";

      

       return getSession().createQuery(searchModules)

       .setParameterList("ids", temp.keySet())

       .list();

    }  

这种管理方式具有很高的

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表