`
897371388
  • 浏览: 530832 次
文章分类
社区版块
存档分类
最新评论

权限管理 (一) 设计思路分析和实现授权、认证

 
阅读更多
  1. 权限的认识
    1. 说起对权限的理解可以说是从肤浅到了解,现在也只是处在了解的水平,先来看这样一个通俗且真实的故事:我们都知道在有体制的公司或者机关单位,给人的体制化特别突出,通俗的说就是官大一级压死人,上级的权利往往要比下面人大,有什么事情了需要经过上级审批、同意才能够执行,这也是一种法律程序,很多事情都需要走法律流程。
    2. 你没有在领导的位置上有些事情你说了就不算需要领导同意,如果某天你的上司说“这件事你说了算,由你负责”这就是把管这事的权利交给你,叫授权;然后,和这件事打交道的人员需要确认谁管这事,这就叫做认证。权限也就是授权和认证的过程。
    3. 在做机房系统中同样也涉及到了权限,系统中分了三类人员管理员、操作员和一般用户,需要根据不同类型的人员显示不同的界面模块,当初实现的时候仅仅是在界面层做了一个简单的判断做的非常粗糙,只是简单的显示出人员对应的模块没有深入的进行控制,如一个模块的增删改查控制,如果该人员对应的模块显示出来了就会有该模块的所有权限,不够灵活。
    4. 随着做的系统逐步变大、模块也增多了我们引入了角色一词表示一组权限的集合,相当于根据实际需求把权限分了“类”分成一组一组的,可以将一组权限授予用户,如此一来,不需要一个个的授予用户变的方便了。当然也可以给某一个用户单独授权。
    5. 权限设计的目标是设计出这样的系统界面:用户授权、认证、模块动态显示等,这部分对于系统的安全性至关重要,因此,权限设计非常重要,也有一些成熟的模型解决权限管理,下面我们来介绍一种实现解决方案:
  2. 实现思路和需求
    1. 把各个模块、角色、用户抽象出来各对应一个实体类,让用户或角色与模块关联并增加属性控制增删改查,这很像是一个M:N的对应关系又往中间一个关系上添加属性,授权的过程中主要通过角色给用户授权,特殊的也可以给用户单独授权。
    1. 用户(User)可以拥有多个角色(Role),角色可以被分配给多个用户
    2. 权限的意思就是对某个资源的某个操作,现在规定:
      1. 所谓资源,即系统的模块
      2. 所谓操作,包括:增加、删除、修改、查询等操作
    3. 权限管理系统的总体功能分为:授权与认证
    4. 授权,指将权限授予角色或用户
      1. 如果用户A拥有角色B、角色C,那么,缺省的情况下,用户A将拥有被分配给角色A和角色C的所有权限(即默认情况下,用户A继承其拥有的角色所具有的所有权限)
      2. 如果用户拥有多个角色,那么用户的权限是这些角色权限的合集
      3. 如果用户拥有多个角色,而且角色之间的授权有冲突(比如对同一个资源的同一个操作,一个角色为“允许”,另外一个角色为“不允许”),将以优先级别高的角色为准(所谓优先级别,也就是对于这个用户所拥有的角色而言,是有顺序的,同一个角色在不同的用户那里可能拥有不同的优先级)
      4. 除了可以对角色进行授权外,也可以针对用户进行授权,也就是说,将权限授予用户。针对某个资源的所有操作,我们可以设置这些权限对用户来说是“继承”或“不继承”
        1. 继承:意思是这些权限将使用其(即用户)所拥有的角色的权限,而不使用其(即用户)单独设置的权限
        2. 不继承:意思是这些权限将使用其单独设置的权限,而不使用其所拥有的角色的权限
    5. 认证,指用户访问资源的某些操作时,根据授权,判断是否允许用户的访问
      1. 在用户访问的时候,需要进行即时的判断(是否有权访问)
      2. 应该提供查询的功能,可以查询某个用户所拥有的所有权限
  3. 抽象实体类
    1. 为了实现生面需求,抽象出来了下面这些实体类,这张类图是主要的实体对象,可以实现权限控制。
    2. ACL
    3. 图中主要不易理解的是ACL类,该类表示访问控制列表(access control list),具有用户或角色与模块的关联关系以及它们的操作标识符,其中,操作标识符利用int的二进制表示,javaint32位可以用其中任意四位代表CRUD,为了方便一些使用最右边四位表示,表示是否有操作权限。
    4. 用户还可以从角色那里继承权限,我们在ACL类中新增加一个int属性表示角色是否被继承,在UsersRoles关系中加入一个字段代表角色的优先级,解决不同角色拥有相同模块时的冲突问题。
  4. 实现
    1. 授权的过程即把模块的访问权授予用户或者角色。
    1. 某一模块授权或者取消授权的代码
    1. 	public void setPermission(int permission,boolean yes){
      		int tmp =1;
      		
      		tmp=tmp << permission;
      		if (yes) {
      			aclState |= tmp;
      		}else {
      			aclState &= ~tmp;
      		}
      	}


    2. 例如setPermission(1,true)表示授予 read 权限,一个int temp = 1的临时变量, aclState为原始授权状态,tmp的二进制表示是: 00000000 00000000 0000000000000001,tmp左移1位得到read。temp = tmp < < 1; temp变成:00000000 00000000 00000000 00000010,而第二位代表的就是read权限。所以也能得出,左移0、1、2、3就能得到Create、Delete、Update、Select权限。
    3. 假设原始授权aclState=00000000 00000000 0000000000001010,当变量yes=true时,为授权,将temp与aclState求|运算,因为temp现在只有他要授权的位为1,求或运算后,aclState=0000000000000000 00000000 00001010,这样就授权成功.
    4. 当变量yes=false时,为取消授权,先将temp取反,即为1111111111111111 11111111 11111011,现在只有要取消权限的位为0,其余全为1,然后与aclState求&运算,则除了要取消权限的位变0,其余的都不变,即aclState=0000000000000000 00000000 00001010.
    1. 授权流程

      1. 	/**
        	 * 授权:对角色或者用户
        	 */
        	public void addOrUpdatePermission(String principalType, int principalSn,
        			int resourceSn, int permission, boolean yes) {
        		//根据主体表示和资源表示查找ACL实例
        		ACL acl=findACL(principalType, principalSn, resourceSn);
        		//如果存在则更新ACL实例,更新授权
        		if (acl!=null) {
        			acl.setPermission(permission, yes);
        			getHibernateTemplate().update(acl);
        			return;
        		}
        		//如果不存在则创建新的实例
        		if (acl==null) {
        			
        			acl=new ACL();
        			acl.setPrincipalType(principalType);
        			acl.setPrincipalSn(principalSn);
        			acl.setResourceSn(resourceSn);
        			acl.setPermission(permission, yes);
        			getHibernateTemplate().save(acl);
        		}
        	}


    1. 认证流程
      1. 	public int getPermission(int permission){
        		
        		if (aclTriState == 0xFFFFFFFF) {
        			return ACL_NEUTRAL;
        		}
        		
        		int tmp=1;
        		tmp=tmp << permission;
        		tmp &= aclState;
        		if (tmp !=0) {
        			return ACL_YES;
        		}
        		return ACL_NO;
        		
        	}



      2. 	public boolean hasPermission(int userId, int resourceSn, int permission) {
        
        		//查找对特定用户的授权
        		ACL acl=findACL(ACL.TYPE_USER, userId,resourceSn);
        		if (acl!=null) {
        			int yesOrNo=acl.getPermission(permission);
        		
        			//如果是确定的授权
        			if (yesOrNo != ACL.ACL_NEUTRAL) {
        				return yesOrNo==ACL.ACL_YES ? true:false;
        			}
        		}
        		//继续查找用户的角色授权
        		String hql="select r.id from UsersRoles ur join ur.user u join ur.role r "+
        					"where u.id=? order by ur.orderNo";
        		
        		List aclIds=getHibernateTemplate().find(hql,userId);
        		//依照角色的优先级依次查找其授权
        		for (Iterator iter = aclIds.iterator(); iter.hasNext();) {
        			Integer rid = (Integer) iter.next();
        			acl=findACL(ACL.TYPE_ROLE,rid, resourceSn);
        			
        			//一旦发现授权,即可返回结果
        			if(acl!=null){
        				return acl.getPermission(permission) == ACL.ACL_YES ?true:false;
        			}
        		}
        		return false;
        	}


  5. 上面是从了解权限到一个权限模块的解决思路和设计步骤,在大小不同的系统中可以适当的扩展和删减,这只是一种思路还有很多关于权限的解决方法比如RBAC等。

分享到:
评论

相关推荐

    统一身份认证管理平台介绍

    3、统一认证身份系统总体设计(总体架构图、身份认证平台功能结构、管理员三权分立原则、系统部署设计普通模式及集群模式、丰富的认证扩展机制、多角度的权限管理、多样化的数据同步服务、灵活的授权策略、丰富的...

    统一身份认证管理平台介绍.pdf

    3、统一认证身份系统总体设计(总体架构图、身份认证平台功能结构、管理员三权分立原则、系统部署设计普通模式及集群模式、丰富的认证扩展机制、多角度的权限管理、多样化的数据同步服务、灵活的授权策略、丰富的...

    软件产品许可证设计方案及源码

    软件产品许可证设计方案及源码,控制产品的部署主机和使用期限

    Web图书管理系统.docx

    设计一个 Web 图书管理系统可以按照以下思路进行分析: 需求调研:了解图书管理的具体需求,包括图书的录入、查询、借阅、归还等功能。 系统架构:确定系统的整体架构,选择合适的技术栈,如前端框架(如 Vue.js 或 ...

    Java毕业设计-基于springboot开发的校园外卖服务系统设计与实现-毕业论文(附毕设源代码).rar

    通过整合Spring Security、MyBatis、Redis等技术,系统实现了用户认证与授权、数据持久化、缓存优化等功能,提升了系统的安全性和性能。 毕业论文详细阐述了系统的设计思路、实现过程以及遇到的挑战与解决方案,为...

    Java毕业设计-基于springboot开发的个人博客系统设计与实现-毕业论文(附毕设源代码).rar

    在毕业论文部分,作者详细阐述了个人博客系统的设计思路、技术选型、系统架构、功能实现以及测试验证等方面,为读者提供了一个完整的项目开发流程。通过阅读论文,读者不仅可以了解个人博客系统的实现细节,还可以...

    SpringBoot项目基于springboot的信息技术知识竞赛系统的设计与实现.zip

    SpringBoot项目基于SpringBoot的信息技术知识竞赛系统是一个网络应用程序,它允许用户参与在线IT知识竞赛,同时为管理员提供题目管理和比赛监控的功能。该系统旨在提供一个平台,通过趣味的竞赛形式来检验用户的IT...

    javaiHRM人力资源管理系统项目实战视频教程

    iHRM是一款基于SaaS平台的人力资源管理系统, 企业通过该系统可以完成员工管理、审批管理、考勤管理、社保公积金管理、薪资管理等功能,为企业的人力资源管理提供一站式解决方案。 掌握的核心能力:  1、能够了解...

    asp.net知识库

    Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制,自己的网站使劲弹新IE窗口 对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的...

    JSP企业电子投票系统(源代码+论文+开题报告+文献综述).rar

    JSP企业电子投票系统是一个基于Java...这些文档详细阐述了系统的设计思路、开发过程、关键技术点以及可能的改进方向,为学习和研究该系统提供了丰富的信息资源。无论是计算机专业的学生还是对JSP技术感兴趣的开发者,这

    课程设计基于Java实现的校园快递代拿系统源码+sql数据库+项目详细说明.zip

    3. 授权粒度只细化到角色级别,白话就是角色即权限,这么做一方面本项目没有前后分离也没有实现前后分离的动态路由,所以没必要细化到各角色权限也能实现该有的功能 4. 一些开源组件实现可能还存在比较细节的错误 ...

    校园网络设计方案.doc

    4 3 网络总体设计 4 网络架构分析 4 设计思路 4 校园网的设计原则 5 网络三层结构设计 6 主干网核心层设计 6 园区内汇聚层设计 6 IP规划与VLAN 7 IP地址的分配原则 7 公网地址分配 7 专用网的IP地址规划 8 专用网中...

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 属主属组及基于数字的权限管理 第5章 01 上节课复习 02 文件合并与文件归档 03 文件归档与两种压缩方式 04 vim编辑器 05 系统启动流程 06 grub加密 07 bios加密 08 top命令 09 free命令 10 进程管理 第6章 01...

    福州某花园第一期会所室内精装修工程.doc

    在工程正式开工前和重要的分项施工工艺开始前,对参与施工的有关管理人员、技术人员和工人班组长进行技术交底工作,使参与施工的人员对本工程设计思路、建筑装饰效果特点、技术要求细节到施工工艺等方面有一个详细的...

    二十三种设计模式【PDF版】

    技术认证,但是如果你没有学习掌握 GoF 设计模式,只能说明你还是一个技工。 在浏览《Thingking in Java》(第一版)时,你是不是觉得好象这还是一本 Java 基础语言书籍?但又不纯粹是,因为这本书的作 者将面向对象...

    门禁系统方案设计.doc

    2 系统概述、设计原则和功能特点 2.1 系统概述 随着高科技的蓬勃发展,智能化管理已经走进了人们的社会生活,一座座智能化大厦 拔地而起,适应信息的时代需要,作为跨世纪使用的建筑和办公环境,必须在功能上满足 ...

    weixin010微信阅读小程序+ssm(源码+部署说明+演示视频+源码介绍+lw).rar

    演示视频和部署说明可能会帮助用户理解如何运行这个小程序,而源码介绍可能会详细说明代码结构和设计思路。"lw"可能指的是某种形式的文档或者作者的签名缩写。 请注意,由于我无法直接访问这个压缩包的内容,以上...

    省会议中心(风味餐厅).doc

    在工程正式开工前和重要的分项施工工艺开始前,对参与施工的有关管理人员、技术人员和工人班组长进行技术交底工作,使参与施工的人员对本工程设计思路、建筑装饰效果特点、技术要求细节到施工工艺等方面有一个详细的...

    TCP网络门禁系统设计方案.docx

    第二章 系统概述、设计原则和功能特点 2.1 系统概述 随着高科技旳蓬勃发展,智能化管理已经走进了人们旳社会生活,一座座智能化大厦拔地而起,适应信息旳时代需要,作为跨世纪使用旳建筑和办公环境,必须在功能上满足...

    JAVA上百实例源码以及开源项目

     //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...

Global site tag (gtag.js) - Google Analytics