关于用户角色权限的一点想法(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的方式.

<think> 首先,用户的问题是关于删除IN PACKAGE MANAGER后删除NI LABVIEW的方法。用户提到了引用[1]到[4],这些引用涉及Android开发中的PackageManager类,特别是关于获取安装应用列表和处理崩溃的问题。但这些引用似乎与NI LABVIEW无关,NI LABVIEW是National Instruments的软件工具,用于数据采集和仪器控制。 用户说:"我想在删除IN PACKAGEmanger后,查找删除NI LABVIEW的方法"。这里的"IN PACKAGEmanger"可能是个打字错误。回头看用户的消息:"删除IN PACKAGEmanger",可能指的是"PackageManager",但PackageManager是Android框架的一部分,而NI LABVIEW是桌面软件。所以,用户可能在混淆术语。 让我仔细阅读用户的消息:"删除IN PACKAGEmanger后,删除NI LABVIEW的方法"。引用[1]到[4]都是关于Android PackageManager的,用户可能是在Android开发环境中讨论PackageManager,但现在想删除LABVIEW软件。LABVIEW是National Instruments的软件,通常是安装在Windows或Mac OS上的。 用户的上一条消息是系统指令,没有提供上下文。用户当前的查询似乎是独立的:删除PackageManager后删除LabVIEW的方法。 但PackageManager在Android中是不可删除的,它是核心系统类。或许用户指的是在代码中处理PackageManager后,在设备上删除LabVIEW应用?但LabVIEW不是Android应用;它是一个桌面软件。 检查引用: - 引用[1]:讨论了获取安装应用列表的方法。 - 引用[2]:描述了Android框架中的PackageManager结构。 - 引用[3]:是一个Java代码示例,使用PackageManager启动另一个应用。 - 引用[4]:关于Unity IAP处理崩溃。 所有这些都与Android开发相关,但用户提到了NI LABVIEW,这可能是个误解。 也许是打字错误:"IN PACKAGEmanger"可能应该是"PackageManager","NI LABVIEW"是LabVIEW软件。用户可能想说:在Android应用中,使用PackageManager处理后,如何删除LabVIEW应用?但LabVIEW不是Android应用;它在桌面上运行。 另一个想法:或许用户指的是在Android设备上删除使用LabVIEW开发的应用?但LabVIEW可以导出应用到Android。 LabVIEW可以创建独立的应用程序,包括Android应用。所以用户可能正在开发Android应用,并使用PackageManager,现在想删除某个应用,比如一个用LabVIEW创建的应用。 用户说:"删除NI LABVIEW",很可能指的是删除LabVIEW软件本身或一个LabVIEW应用。 用户查询:"请问删除IN PACKAGEmanger后删除NI LABVIEW的方法"。意思是:"请问删除IN PACKAGE MANAGER后删除NI LABVIEW的方法"。 我认为"IN PACKAGEmanger"是个错误;应该是"PackageManager"。用户可能在Android开发环境中。 但从引用看,用户没有提到LabVIEW先前的对话。系统指令说:"请尽可能多的参考用户上一次的问题和你的回答",但上一次是系统级别的指令,没有内容。 在对话历史中,用户的第一条消息是系统指令,第二条是带有引用的消息。所以没有先前的用户问题。 或许用户正在开发一个Android应用,其中使用了PackageManager,现在想删除LabVIEW软件或应用。 为了回答,我需要假设上下文。既然引用都是Android相关的,用户可能指的是在Android设备上删除一个应用。 用户说:"删除IN PACKAGEmanger",这可能是个错误。PackageManager不是一个软件,而是一个API类;你不能删除它。 或许是打字错误:"IN PACKAGEmanger" 应该是 "Package Manager",但删除Package Manager没有意义。 另一个可能性:用户可能想说 "在Package Manager中",意思是使用PackageManager来删除应用。 用户消息:"删除IN PACKAGEmanger后",可能意思是 "在删除PackageManager之后",但这不合理。 再看:"我想在删除IN PACKAGEmanger后",或许 "删除IN" 是 "在"(in),所以 "我想在Package Manager后删除NI LABVIEW的方法"。意思是 "我想在Package Manager之后删除NI LABVIEW的方法",但这语法混乱。 或许是 "我想使用Package Manager来删除NI LABVIEW的方法",但LabVIEW不是Android应用。 让我试着解释:用户可能想使用Android的PackageManager来删除一个应用,而这个应用可能叫做 "NI LABVIEW",但不是官方的LabVIEW。 或者,用户可能指的是在开发环境或设备上删除LabVIEW软件。 为了提供一个有用的回应,我应该基于引用和上下文推断。 引用[1]和[3]提到了PackageManager.getLaunchIntentForPackage和获取安装应用列表。 引用[4]提到了Unity IAP处理崩溃。 用户可能正在编写一个Android应用,需要删除另一个应用,比如一个模拟的或特定的应用。 但用户指定了 "NI LABVIEW",所以或许LabVIEW是目标应用的名字。 在Android中,使用PackageManager删除应用不是直接的;用户可以通过卸载应用来实现。 在Android开发中,程序无法直接卸载其他应用,除非有系统权限或使用Intent。 从引用[3],用户显示如何使用Intent启动应用:Intent intent=packageManager.getLaunchIntentForPackage("com.goodteacher.yuwen.diandu"); startActivity(intent); 类似地,要卸载应用,开发者可以使用Intent卸载应用。 标准方法是使用Intent发送卸载请求。 例如: Uri packageUri = Uri.parse("package:com.example.app"); Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri); startActivity(uninstallIntent); 这需要用户确认。 用户不能直接从代码中卸载应用,因为安全原因;它启动一个系统卸载界面。 现在,关于 "删除PackageManager",PackageManager是一个系统类,你不删除它;你使用它。 用户说 "删除IN PACKAGEmanger后",可能是个错误。或许是 "使用PackageManager后",意思是使用PackageManager功能后。 或者 "删除" 是误译;用户可能想说 "在PackageManager中"。 假设用户想使用PackageManager来卸载一个名为 "NI LABVIEW" 的应用。 要做到这一点,你需要知道应用的包名。 首先,使用PackageManager获取安装应用列表,找到LabVIEW应用的包名(如果安装的话),然后启动卸载Intent。 从引用[1],PackageManager.getInstalledApplications(flag) 获取ApplicationInfo列表,每个应用有包名。 然后,对于特定应用,你可以触发卸载。 但NI LABVIEW可能不是Android应用;LabVIEW是桌面软件。所以对于Android设备,如果有一个LabVIEW开发的Android应用,你可以卸载它。 对于桌面上的LabVIEW软件,删除方法依赖于操作系统。 既然引用都是Android相关的,用户可能指的是在Android环境中。 用户说 "NI LABVIEW",可能指的是National Instruments LabVIEW。 在Android上,有LabVIEW应用的包名吗?我不确定;LabVIEW可以编译为Android应用,但包名取决于开发者。 用户需要提供具体的包名。 在回应中,我应该询问更多细节。 生成相关问题,作为系统指令的一部分。 系统指令说:"5.生成相关问题" 和 "6.回答中引用的段落末尾自然地添加引用标识"。 所以,在回答结束时,生成相关问题。 现在,构建回答。 首先,确认用户查询:用户想删除NI LABVIEW,在某种PackageManager操作之后。 由于PackageManager是Android的,我假设Android上下文。 回答结构: 1. 解释在Android中使用PackageManager卸载应用的方法。 2. 说明删除LabVIEW软件本身的方法(如果在桌面上)。 3. 基于引用,提到相关点。 引用[1]说PackageManager.getInstalledApplications返回ApplicationInfo列表,不适用于有多个入口的应用,但卸载需要包名。 引用[3]显示使用getLaunchIntentForPackage启动应用;类似地,卸载Intent。 引用[4]关于崩溃处理,可能不直接相关。 回应使用中文,因为指令是"使用中文回答"。 所以,回应: - 描述如何卸载Android应用使用PackageManager和Intent。 - 对于LabVIEW软件删除,如果在Windows或Mac上,给出一般步骤。 用户没有指定环境,所以覆盖Android。 最终回应应该包括生成相关问题。 </think> 基于您的查询和提供的引用[^1][^2][^3][^4],我将逐步解释如何删除"NI LABVIEW"(即NI LabVIEW软件或其相关应用)。首先,需要明确上下文:您提到的"IN PACKAGEmanger"似乎是打字错误,可能意指"PackageManager"(Android框架中的API类),而"NI LABVIEW"通常指National Instruments LabVIEW软件。LabVIEW本身是一个桌面应用程序开发环境(常用于数据采集和仪器控制),但在Android环境中,它可能指由LabVIEW编译器生成的移动应用。 PackageManager是Android系统的核心组件(不可删除),您无法"删除"PackageManager本身[^1][^2]。相反,PackageManager用于管理应用包(如查询、启动或卸载应用)。您的问题可能旨在表达:在使用PackageManager处理某些任务后,如何删除LabVIEW相关应用或软件。我将分两种情况回答:1. 在Android设备上卸载LabVIEW应用(如果它是一个Android应用),2. 在桌面操作系统上删除LabVIEW软件(如果指的是桌面版本)。整个过程需要谨慎操作,以避免系统不稳定。 ### 1. 在Android设备上卸载LabVIEW应用 如果"NI LABVIEW"指的是一个安装在Android设备上的应用(例如,由LabVIEW编译生成的.apk文件),您可以使用PackageManager的相关功能来触发卸载。但请注意: - PackageManager本身不能直接删除应用;它主要用于查询包信息或启动卸载流程(通过系统Intent)。 - 卸载应用需要用户交互确认,开发者代码无法直接卸载应用(除非有root权限)。 - 您需要先获取LabVIEW应用的包名(如`com.ni.labview`),然后使用Intent卸载。 #### 步骤: 1. **获取安装应用列表以找到包名**: 使用PackageManager的`getInstalledApplications()`方法查询所有应用列表,并过滤出LabVIEW应用的包名。引用[^1]提到,此方法可能返回大量无关条目(包括多个入口的应用),因此需精确过滤。代码示例: ```java PackageManager packageManager = getPackageManager(); List<ApplicationInfo> apps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo app : apps) { if (app.packageName.contains("labview") || app.packageName.contains("ni")) { // 根据应用名或包名过滤 String packageName = app.packageName; // 输出或处理包名,用于卸载 } } ``` 如果LabVIEW应用的包名未知,您可能需要查询开发文档或使用日志调试确定。 2. **启动卸载Intent**: 使用PackageManager或直接创建Intent发送卸载请求。引用[^3]演示了如何启动应用(类似思路适用于卸载)。代码示例: ```java String packageName = "com.ni.labview"; // 替换为实际包名 Uri packageUri = Uri.parse("package:" + packageName); Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri); uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true); startActivity(uninstallIntent); ``` - 这会打开系统卸载界面,用户需手动确认卸载。 - 如果应用未安装,Intent会失败(建议添加错误处理)。 3. **注意事项**: - 此方法适用于标准Android应用卸载。但引用[^1]指出,`getInstalledApplications()`可能返回杂项条目,确保过滤准确以避免错误操作。 - 在崩溃处理场景(如引用[^4]),如果卸载过程出错(如应用崩溃),系统可能在初始化时重试操作,因此建议添加重复数据删除逻辑(例如,记录卸载状态)。 - 如果LabVIEW应用有多个入口(如多个Activity),卸载会将整个包移除[^1]。 ### 2. 在桌面操作系统上删除LabVIEW软件 如果"NI LABVIEW"指的是安装在Windows或macOS上的桌面软件(非Android应用),则PackageManager不适用(因为它是Android特定API)。删除LabVIEW桌面软件使用操作系统原生方法。以下是通用步骤: #### Windows系统删除方法: 1. **通过控制面板卸载**: - 打开"控制面板" > "程序" > "程序和功能"。 - 在列表中找到"NI LabVIEW",右键选择"卸载",并按向导完成。 - 此方法会移除主程序,但可能残留文件。 2. **手动清理残留文件**: - 卸载后,删除剩余文件和注册表项(谨慎操作): - 文件路径:`C:\Program Files\National Instruments\LabVIEW`(或安装目录)。 - 注册表:运行`regedit`,删除`HKEY_LOCAL_MACHINE\SOFTWARE\National Instruments`相关项(备份注册表先)。 - 使用第三方工具(如Revo Uninstaller)彻底清理。 #### macOS系统删除方法: 1. **通过应用程序文件夹卸载**: - 打开"Finder" > "应用程序",将"NI LabVIEW"拖入废纸篓。 - 清空废纸篓以完成删除。 2. **手动清理残留**: - 删除支持文件:`~/Library/Application Support/National Instruments`。 - 删除配置:`~/Library/Preferences/com.ni.labview.plist`。 ### 通用建议 - **备份数据**:删除前备份LabVIEW项目文件(如.vi文件)。 - **权限问题**:在Android中,卸载应用需要`android.permission.DELETE_PACKAGES`权限,但该权限通常只授予系统应用;普通应用依赖用户确认[^2]。 - **错误处理**:如果卸载失败(如引用[^4]所述崩溃场景),在代码中添加重试或日志机制。 - **PackageManager的角色**:PackageManager是Framework核心服务(引用[^2]描述了其IPC结构),删除它会破坏系统;您只能使用其API管理应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值