`
weiwu83
  • 浏览: 192178 次
  • 来自: ...
社区版块
存档分类
最新评论

关于用户角色权限的一点想法(2)

阅读更多

1.创造权限 - Creator创造,2.分配权限 - Administrator 分配,3.使用权限 - User<o:p></o:p>

1. Creator 创造 Privilege Creator 在设计和实现系统时会划分,一个子系统或称为模块,应该有哪些权限。这里完成的是 Privilege Resource 的对象声明,并没有真正将 Privilege 与具体Resource 实例联系在一起,形成Operator<o:p></o:p>

2. Administrator 指定 Privilege Resource Instance 的关联。在这一步, 权限真正与资源实例联系到了一起, 产生了OperatorPrivilege Instance)。Administrator利用Operator这个基本元素,来创造他理想中的权限模型。如,创建角色,创建用户组,给用户组分配用户,将用户组与角色关联等等...这些操作都是由 Administrator 来完成的。<o:p></o:p>

3. User 使用 Administrator 分配给的权限去使用各个子系统。Administrator 是用户,在他的心目中有一个比较适合他管理和维护的权限模型。于是,程序员只要回答一个问题,就是什么权限可以访问什么资源,也就是前面说的 Operator。程序员提供 Operator 就意味着给系统穿上了盔甲。Administrator 就可以按照他的意愿来建立他所希望的权限框架可以自行增加,删除,管理ResourcePrivilege之间关系。可以自行设定用户User和角色Role的对应关系。(如果将 Creator看作是 Basic 的发明者, Administrator 就是 Basic 的使用者,他可以做一些脚本式的编程) Operator是这个系统中最关键的部分,它是一个纽带,一个系在ProgrammerAdministratorUser之间的纽带。<o:p></o:p>

用一个功能模块来举例子。<o:p></o:p>

一.建立角色功能并做分配:<o:p></o:p>

1.如果现在要做一个员工管理的模块(Resources),这个模块有三个功能,分别是:增加,修改,删除。给这三个功能各自分配一个ID,这个ID叫做功能代号:<o:p></o:p>

Emp_addEmpEmp_deleteEmpEmp_updateEmp<o:p></o:p>

2.建立一个角色(Role),把上面的功能代码加到这个角色拥有的权限中,并保存到数据库中。角色包括系统管理员,测试人员等。<o:p></o:p>

3.建立一个员工的账号,并把一种或几种角色赋给这个员工。比如说这个员工既可以是公司管理人员,也可以是测试人员等。这样他登录到系统中将会只看到他拥有权限的那些模块。<o:p></o:p>

二.把身份信息加到Session中。<o:p></o:p>

登录时,先到数据库中查找是否存在这个员工,如果存在,再根据员工的sn查找员工的权限信息,把员工所有的权限信息都入到一个Hashmap中,比如就把上面的Emp_addEmp等放到这个Hashmap中。然后把Hashmap保存在一个UserInfoBean中。最后把这个UserInfoBean放到Session中,这样在整个程序的运行过程中,系统随时都可以取得这个用户的身份信息。<o:p></o:p>

三.根据用户的权限做出不同的显示。<o:p></o:p>

可以对比当前员工的权限和给这个菜单分配的“功能ID”判断当前用户是否有打开这个菜单的权限。例如:如果保存员工权限的Hashmap中没有这三个ID的任何一个,那这个单就不会显示,如果员工Hashmap中有任何一个ID,那这个单都会显示。 <o:p></o:p>

对于一个新闻系统(Resouce),假设它有这样的功能(Privilege):查看,发布,删除,修改;假设对于删除,有"新闻系统管理者只能删除一月前发布的,而超级管理员可删除所有的这样的限制,这属于业务逻辑(Business logic),而不属于用户权限范围。也就是说权限负责有没有删除的Permission,至于能删除哪些内容应该根据UserRole or UserGroup来决定(当然给UserRole or UserGroup分配权限时就应该包含上面两条业务逻辑)<o:p></o:p>

一个用户可以拥有多种角色,但同一时刻用户只能用一种角色进入系统。角色的划分方法可以根据实际情况划分,按部门或机构进行划分的,至于角色拥有多少权限,这就看系统管理员赋给他多少的权限了。用户—角色—权限的关键是角色。用户登录时是以用户和角色两种属性进行登录的(因为一个用户可以拥有多种角色,但同一时刻只能扮演一种角色),根据角色得到用户的权限,登录后进行初始化。这其中的技巧是同一时刻某一用户只能用一种角色进行登录。<o:p></o:p>

针对不同的“角色”动态的建立不同的组,每个项目建立一个单独的Group,对于新的项目,建立新的 Group 即可。在权限判断部分,应在商业方法上予以控制。比如:不同用户的“操作能力”是不同的(粗粒度的控制应能满足要求),不同用户的“可视区域”是不同的(体现在对被操作的对象的权限数据,是否允许当前用户访问,这需要对业务数据建模的时候考虑权限控制需要)<o:p></o:p>

扩展性:<o:p></o:p>

有了用户/权限管理的基本框架,Who(User/Group)的概念是不会经常需要扩展的。变化的可能是系统中引入新的 What (新的Resource类型)或者新的How(新的操作方式)。那在三个基本概念中,仅在Permission上进行扩展是不够的。这样的设计中Permission实质上解决了How 的问题,即表示了“怎样”的操作。那么这个“怎样”是在哪一个层次上的定义呢?将Permission定义在“商业方法”级别比较合适。比如,发布、购买、取消。每一个商业方法可以意味着用户进行的一个“动作”。定义在商业逻辑的层次上,一方面保证了数据访问代码的“纯洁性”,另一方面在功能上也是“足够”的。也就是说,对更低层次,能自由的访问数据,对更高层次,也能比较精细的控制权限。<o:p></o:p>

确定了Permission定义的合适层次,更进一步,能够发现Permission实际上还隐含了What的概念。也就是说,对于WhatHow操作才会是一个完整的Operator。比如,“发布”操作,隐含了“信息”的“发布”概念,而对于“商品”而言发布操作是没有意义的。同样的,“购买”操作,隐含了“商品”的“购买”概念。这里的绑定还体现在大量通用的同名的操作上,比如,需要区分“商品的删除”与“信息的删除”这两个同名为“删除”的不同操作。<o:p></o:p>

提供权限系统的扩展能力是在Operator (Resource + Permission)的概念上进行扩展。Proxy 模式是一个非常合适的实现方式。实现大致如下:在业务逻辑层(EJB Session Facade [Stateful SessionBean]),取得该商业方法的Methodname,再根据Classname Methodname 检索Operator 数据,然后依据这个Operator信息和Stateful中保存的User信息判断当前用户是否具备该方法的操作权限。<o:p></o:p>

应用在 EJB 模式下,可以定义一个很明确的 Business层次,而一个Business 可能意味着不同的视图,当多个视图都对应于一个业务逻辑的时候,比如,Swing Client以及 Jsp Client 访问的是同一个 EJB 实现的 Business。在 Business 层上应用权限较能提供集中的控制能力。实际上,如果权限系统提供了查询能力,那么会发现,在视图层次已经可以不去理解权限,它只需要根据查询结果控制界面就可以了。<o:p></o:p>

灵活性<o:p></o:p>

GroupRole,只是一种辅助实现的手段,不是必需的。如果系统的Role很多,逐个授权违背了“简单,方便”的目的,那就引入Group,将权限相同的Role组成一个Group进行集中授权。Role也一样,是某一类Operator的集合,是为了简化针对多个Operator的操作。<o:p></o:p>

Role把具体的用户和组从权限中解放出来。一个用户可以承担不同的角色,从而实现授权的灵活性。当然,Group也可以实现类似的功能。但实际业务中,Group划分多以行政组织结构或业务功能划分;如果为了权限管理强行将一个用户加入不同的组,会导致管理的复杂性。<o:p></o:p>

Domain的应用。为了授权更灵活,可以将Where或者Scope抽象出来,称之为Domain,真正的授权是在Domain的范围内进行,具体的Resource将分属于不同的Domain。比如:一个新闻机构有国内与国外两大分支,两大分支内又都有不同的资源(体育类、生活类、时事政治类)。假如所有国内新闻的权限规则都是一样的,所有国外新闻的权限规则也相同。则可以建立两个域,分别授权,然后只要将各类新闻与不同的域关联,受域上的权限控制,从而使之简化。<o:p></o:p>

权限系统还应该考虑将功能性的授权与资源性的授权分开。很多系统都只有对系统中的数据(资源)的维护有权限控制,但没有对系统功能的权限控制。<o:p></o:p>

权限系统最好是可以分层管理而不是集中管理。大多客户希望不同的部门能且仅能管理其部门内部的事务,而不是什么都需要一个集中的AdministratorAdministrators组来管理。虽然你可以将不同部门的人都加入Administrators组,但他们的权限过大,可以管理整个系统资源而不是该部门资源。<o:p></o:p>

正向授权与负向授权:正向授权在开始时假定主体没有任何权限,然后根据需要授予权限,适合于权限要求严格的系统。负向授权在开始时假定主体有所有权限,然后将某些特殊权限收回。<o:p></o:p>

权限计算策略:系统中UserGroupRole都可以授权,权限可以有正负向之分,在计算用户的净权限时定义一套策略。<o:p></o:p>

系统中应该有一个集中管理权限的AccessService,负责权限的维护(业务管理员、安全管理模块)与使用(最终用户、各功能模块),该AccessService在实现时要同时考虑一般权限与特殊权限。虽然在具体实现上可以有很多,比如用Proxy模式,但应该使这些Proxy依赖于AccessService。各模块功能中调用AccessService来检查是否有相应的权限。所以说,权限管理不是安全管理模块自己一个人的事情,而是与系统各功能模块都有关系。每个功能模块的开发人员都应该熟悉安全管理模块,当然,也要从业务上熟悉本模块的安全规则。<o:p></o:p>

技术实现<o:p></o:p>

1.表单式认证,这是常用的,但用户到达一个不被授权访问的资源时,Web容器就发<o:p></o:p>

出一个html页面,要求输入用户名和密码。 <o:p></o:p>

2.一个基于Servlet Sign in/Sign out来集中处理所有的Request,缺点是必须由应用程序自己来处理。<o:p></o:p>

3.用Filter防止用户访问一些未被授权的资源,Filter会截取所有Request/Response<o:p></o:p>

然后放置一个验证通过的标识在用户的Session中,然后Filter每次依靠这个标识来决定是否放行Response<o:p></o:p>

这个模式分为:<o:p></o:p>

Gatekeeper :采取Filter或统一Servlet的方式.

分享到:
评论

相关推荐

    角色用户权限DB设计

    一直想整理一篇关于用户角色权限的设计,这几天通过网上资料和自己实际工作中运用到的资源把用户角色权限的数据库表设计出来。 基础表有3张: 角色表--用来记录角色名称 用户表--用来记录登录用户名称和登录密码 ...

    针对SU53提示修改用户角色权限

    ### SU53提示修改用户角色权限 在企业管理与IT系统管理中,用户权限管理是非常重要的一环,它关乎系统的安全性和操作的规范性。本文主要围绕“SU53提示修改用户角色权限”的主题展开,详细解析SU53事务码的作用、...

    C# winform 权限控制 包括角色 用户 权限设置

    2. **角色**:一组具有相同权限的用户集合。角色的概念简化了权限管理,因为我们可以为角色分配权限,而不是逐个为用户设置。 3. **权限**:定义用户可以执行的操作。权限可以细化到应用程序的各个功能,比如查看、...

    SpringBoot + SpringSecurity + JPA 实现用户角色权限登录认证

    本项目结合了SpringBoot、SpringSecurity以及JPA(Java Persistence API),实现了用户角色权限的登录认证功能。以下是关于这些技术及实现过程的详细讲解。 1. **SpringBoot**:SpringBoot简化了Spring应用的初始...

    角色权限表设计

    初步估计一下,本系统至少需要十张表,分别为:权限表、用户表、角色表、组表、用户权限关联表、用户角色关联表、角色权限关联表、组权限关联表、组角色关联表、用户属组关联表。 权限管理是应用系统中比较棘手的...

    基于C# WinForm的用户角色权限管理系统.zip

    此项目基于mysql5.0、visual studio 2017开发出来的,主要功能包括用户的登录注册,学生信息以及成绩的增删改查,账号的增删改查,菜单的增删改,对角色分配菜单项,即授权。对账号选定角色,账号登录之后只会显示给...

    基于角色的权限管理数据库设计

    在基于角色的权限管理系统中,除了上述的基本表之外,还需要设计一些关联表来表示实体之间的关系,如用户与角色的关系、角色与权限的关系等。 ##### 用户与角色关联表 (RBAC_User_Role) 此表用于记录用户所拥有的...

    sap角色权限设置手册

    * 用户权限查看:在维护角色时,需要注意用户的权限查看,例如查看采购订单的权限。 四、角色设置的应用场景 1. 采购管理 在采购管理中,角色设置可以控制用户的采购订单创建、更改和查看权限。 2. 库存管理 在...

    spring+springmvc+mybatis项目案例实现用户角色权限管理

    使用spring+springmvc框架 整合了Mybatis持久层框架 整合Druid用于数据库连接,并使用Druid对业务层监控spring jdbc 整合EhCache,对Mybatis的二级缓存进行管理和对spring进行缓存管理 ...整合hibernate.validator校验...

    用户角色权限-控制系统Demo

    用户角色权限-控制系统Demo

    金蝶系统用户权限分配表

    首先,权限分配是基于角色的访问控制(Role-Based Access Control, RBAC)模型,即通过定义不同角色并为角色分配相应的操作权限,用户在登录系统时将获得其所扮演角色的全部权限。这样可以有效地管理和控制员工对...

    JAVA用户、角色、权限、菜单、工作流管理系统

    目前系统已经基本集成的功能包含有,用户管理,角色管理,菜单管理,组织管理,数据字典,日志管理,接口管理(暂时未完成实际应用),流程配置,运行流程管理,消息管理(暂无实际应用),业务模块没有做。后台是基于...

    C# WinForm实现基于角色权限的菜单

    在C# WinForm应用开发中,构建一个基于角色权限的菜单是常见的需求,尤其是在企业级应用中,确保不同用户群体只能访问他们被授权的操作。这个项目利用Visual Studio 2008或更高版本来实现这样的功能,展示了如何将...

    【猿来入此】SSM框架角色权限管理系统脚手架源码

    用户表存储用户的基本信息,角色表存储角色及其描述,权限表定义具体的操作权限,用户角色关联表则记录用户属于哪些角色。 6. **运行截图、项目源码、项目素材、数据库文件**:这些资源对理解并运行此系统至关重要...

    信息系统用户帐号和角色权限管理流程.pdf

    信息系统用户帐号和角色权限管理流程.pdf信息系统用户帐号和角色权限管理流程.pdf信息系统用户帐号和角色权限管理流程.pdf信息系统用户帐号和角色权限管理流程.pdf信息系统用户帐号和角色权限管理流程.pdf

    Oracle11用户角色权限等操作.pdf

    ..Oracle11用户角色权限等操作.pdf

    PHP网站后台角色权限管理系统源码.zip

    用户表存储用户信息,角色表记录角色信息,权限表定义系统的所有权限,角色权限关联表用于关联角色和权限。 四、核心功能实现 4.1 用户注册与登录:系统提供用户注册和登录功能,通过验证用户名和密码来确定用户...

    Oracle用户权限角色设置

    Oracle用户权限角色设置,用来在新建的数据库中添加新的用户,并为其设置权限。

    Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    在Asp.Net MVC框架中,开发人员经常使用BootStrap和Entity Framework(EF6.0)来构建功能丰富的Web应用程序,其中包括用户角色权限管理。这是一个关键的系统设计部分,用于确保用户只能访问他们被授权的功能和数据。...

    (源码)基于Spring Boot和Spring Cloud的权限管理系统.zip

    用户角色管理支持为用户分配角色,并管理用户的角色权限。 ### 角色管理 角色创建与编辑支持创建和编辑角色,设置角色的名称、编码、描述等信息。 角色权限管理支持为角色分配菜单和资源权限,并管理角色的权限...

Global site tag (gtag.js) - Google Analytics