看了discuz后台的用户权限设定,很详细,觉得很不错,就想自己要是能做出来就好了。
绞尽脑汁想出来一点,拿出来给高手看看,抛砖引玉,希望高手们能提出更好的方案,让大家以后权限管理的时候更轻松些。思考过程就不说了,没什么理论性的东西,无非是想想平时接触的操作系统,软家等的权限管理方式,再“灵光一闪”就得到了结果。
通过URL匹配控制访问权限,也就是在用户请求某个URL的时候,查看该用户是否有这个权限。这个“查看”是在一个Filter中进行的。判断用户是否有权限的标准是在一个xml文件中配置的。Dtd文档如下
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT privilege (globe-error?,allmapping,user-name,mapping*)>
<!ELEMENT globe-error (#PCDATA)>
<!ELEMENT allmapping (#PCDATA)>
<!ELEMENT user-name (#PCDATA)>
<!ELEMENT mapping (error?, message)>
<!ELEMENT error (#PCDATA)>
<!ELEMENT message (#PCDATA)>
<!ATTLIST globe-error redirect (false|true) "false">
<!ATTLIST error redirect (false|true) "false">
<!ATTLIST mapping
name CDATA #REQUIRED
url CDATA #REQUIRED
code CDATA #REQUIRED>
<!ATTLIST message key CDATA #IMPLIED >
Xml文档的核心是mapping元素,有url,code属性(必选)和error,message子元素。url表示匹配的URL,code是权限码,当用户的权限码符合这里的配置的权限码时,就认为用户用权限访问该URL,name属性唯一表示一个mapping。allmapping元素是的内容所有mapping元素name的集合,每个name之间用一个符号隔开,比如’|’或’,’都可以,用来帮助自动生成权限码,后面详细说明。Error(可选,如果没有则使用globe-error)是用户无权限时显示的错误页面,redirect属性(可选)制定forward到错误页面还是redirect到forward页面。message指定返回的错误信息(支持国际化)。
用户的权限码存放在用户的session中,由于我习惯上把用户信息放在一个User对象中,再保存到session中,所以这里我的想法是User对象中有个属性表示用户权限码,比如可以这样获取:
pcode=(User)session.getAttribute("user").getCode();//pcode就是用户权限码
下面就开始说权限是如何设定的了。
先说说linux的文件权限设定,比如设定一个文件的权限111010010(所有者读写执行,同组读,其他人读),用了三组三位的二进制数,第一组是文件所有者,第二组是和所有者在同一组的用户,第三组是和所有者没有任何关系的其他人。每一组中,第一位表示“读”的权限,第二位表示“写”的权限,第三位表示“执行”的权限。好,我们的权限表示方法也出现了,allmapping元素的作用也显示出来了。allmapping中有n的mapping设定,mapping中name出现的顺序是有意义的,不过开发者不用关心它的顺序,让大家注意顺序是为了下面说明的更方便点。例如:
<allmapping>read|add|delete<allmapping>
<mapping name=”read” url=”/read.do”>
<error>/errorpage.jsp</error>
<message key=”error.read”>没有权限读取的信息</message>
</mapping>
<mapping name=”add” url=”/add.do”>
<error>/errorpage.jsp</error>
<message key=”error.add”>没有权限添加的信息</message>
</mapping>
<mapping name=”delete” url=”/delete.do”>
<error>/errorpage.jsp</error>
<message key=”error.delete”>没有权限删除的信息</message>
</mapping>
用户的权限最终表示成一个二进制数,当用户访问一个URL是,如果第i个mapping匹配了这个URL,就检查用户权限二进制数的第i位,如果该位为1说明用户有此权限,为0则说明用户无此权限。
OK,那么怎么设定用户权限呢?总不能随便给一串二进制数吧!当然不能。下面是两个设定用户权限的方法:
一:用户权限用二进制数表示,在负责权限管理的类中(所有的一切和validation一样,应该是有一个类库的)有getCode(mapping-name)方法,getCode返回一个n位二进制串,如果名字为mapping-name的mapping在第i位,则此二进制数的第i位为1,其他位为0。如果用户设定的权限有read和add,使用getCode(“read”)和getCode(“add”)获得两串权限码,再进行按位或运算就得到用户的最终权限码,用上面的设置,getCode(“read”)返回”100”,getCode(“add”)返回”010”,用户的权限码就是100|010=110,也就是读和添加权限。
二:用户权限用十进制数表示,经常用linux的朋友可能更喜欢这种方式,因为大家都喜欢用”chmod 744 文件名”的方式设定文件权限。这种方式中,负责权限管理的类返回的是一个10进制数,这个十进数的值和上面说的二进制数的值是相等的,比如二进制返回100,十进制就是4(二进制转十进制嘛!)。和上面相似,这次不是按位或运算,而是直接加运算。
还是设置读和添加权限,getCode(“read”)返回4,getCode(“add”)返回2,用户权限的表示就是2+4=6.
上面是总体方案,在具体实现时,用一个长整型数表示权限。还设计了一个接口:
Privilege{
public long getPrivilege()
}//User对象应该实现这个接口,这样在Filter中我们使用
Privilege p=(Privilege)session.getAttribute("user");
p.getPrivilege();
就可以获取权限码。
其他细节还有url可以使用正则表达式,如果用户请求的url匹配多个配置项,那么只有用户的权限匹配所有的要求时才能算通过。这也安全性好一点。对没有配置的url,默认全部不需要任何权限,即任何人可访问。
在前台,我们一般都不会显示不想用户看到的超链接。比如对一个只有发布新闻的用户,肯定不想他看到删除新闻的链接。我的方案是在设计一个标签<privilege>有url属性,表示下面的操作要访问的url。如删除新闻:
<privilege url="/deletenews.do">other</privilege>
标签的大致实现是:获取当前用户权限码,获取配置文件中url的权限码。如果当前用户的权限不足以访问该url,则skipbody,否则eavlbody。(个人觉得很方便,省去了一堆if)。
整体的思路就是这样,我写了一个实现,已经证明可行,自认为自己的OOD太差,代码写的也不精致。不敢再拿出来献丑,而且仅就实现这个方法来说,还是很容易的。
恳请各位提出不足或更好的方案,或为此方案写出漂亮的代码。
分享到:
相关推荐
### ASP系统中多用户设置和权限分配的解决方案 #### 一、引言 随着网络技术的发展,越来越多的应用程序需要支持多用户模式,并实现不同级别的权限管理。ASP (Active Server Pages) 是微软开发的一种服务器端脚本...
本次的“管理权限功能升级解决方案”旨在解决传统平台上存在的权限分配不灵活、管理负担重以及权限滥用风险等问题,以适应大企业复杂的组织结构和多部门协作的需求。 首先,升级一引入了多部门管理功能。原先的系统...
本文将围绕 PB 中权限管理的解决方案展开,主要介绍了一种简单的多用户权限控制方案,并详细说明了实现方法和技术要点。 多用户权限控制方案 在 PB 中实现多用户权限控制的一种简单方法是,在用户信息表中加入一个...
本项目"用户权限管理模块(C++实现)"是一个用C++编程语言实现的权限管理解决方案,它包含了几个核心功能,如单例模式、用户区分、用户管理以及密码安全存储。 首先,我们来深入理解C++实现的用户权限管理模块。C++...
本文将详细介绍如何利用d2-admin这个强大的后台管理系统框架,构建一个RBAC权限管理解决方案。 **d2-admin简介** d2-admin是一款由Vue.js驱动的后台管理框架,它提供了一套完整的页面布局、组件、工具和示例代码,...
### 统一用户管理解决方案深度解析 #### 一、引言 随着企业信息化的深入发展,用户信息管理逐渐成为组织内部资源与服务访问控制的核心环节。传统的分散式用户管理方式已无法满足现代企业对高效、安全、统一管理的...
### Pb中多用户权限管理实现方案 #### 一、引言 在开发PB应用程序时,尤其是在需要支持多用户环境下的管理信息系统中,实现细致的权限管理是非常重要的。本文旨在介绍如何在PB中实现多用户权限管理,特别是针对不同...
在构建一个通用的权限管理模型时,需要考虑多个方面,包括但不限于资源、操作类型、功能权限、数据类型、数据对象、角色、用户以及用户组等。下面详细阐述这些关键知识点。 一、基于角色的访问控制(RBAC) RBAC...
综上所述,Vue2.0用户权限控制解决方案结合Vue Router的动态路由和导航守卫功能,能够实现灵活且安全的权限管理。同时,与服务端的紧密协作,确保了整个应用的安全性。通过这个方案,开发者可以构建出适应各种权限...
【jsp用户权限管理系统】是一个基于JavaServer Pages(JSP)技术构建的权限管理解决方案,用于控制用户对系统资源的访问和操作。这个系统通常包括一套完整的界面,旨在提供美观且功能丰富的用户体验。根据描述,该...
该解决方案的系统结构主要包括仓储业务管理子系统、费用结算管理子系统、客户远程查询子系统、动产质押监控子系统等多个子系统。每个子系统都具有其特有的功能和特点。 仓储业务管理子系统: 仓储业务管理子系统是...
2. **建设内容**:xx公司旨在构建一个全面的外包管理门户,让供方(人力资源提供方)能够监控在外单位工作的员工,同时让需方(需求方)能有效地管理外包人员的考勤、绩效和项目进展。 ### 二、业务流程分析 1. **...
用户认证管理设计方案是确保系统安全性的重要组成部分,它涉及到用户、角色和权限的管理。在设计这样的系统时,首要目标是创建一个可扩展性强且易于维护的架构。以下是关于这一主题的详细阐述: 1. 用户管理:用户...
总的来说,"GIS用户权限管理-基于角色的用户权限管理模块"是一个全面且灵活的解决方案,它覆盖了从数据库支持、角色管理、用户权限分配到地图访问控制的各个环节,并且具备二次开发能力,适应不同场景下的GIS应用...
4A(统一安全管理平台)是企业信息化建设中一个至关重要的组成部分,主要目标是解决日益复杂的IT环境下的身份认证、账号管理、权限分配和安全审计问题。这个概念源于四个英文单词的首字母:Authentication(认证)、...
"java 用户权限管理图" 本文主要讲解了 Java 用户权限管理图的设计和实现,特别是针对 B/S 系统中的...本文主要讲解了 Java 用户权限管理图的设计和实现,提供了一种可行的解决方案来实现 B/S 系统中的权限管理问题。
总的来说,"部门及用户权限管理(带例子)"是一个实用的IT解决方案,旨在简化权限管理和用户控制,提高系统的安全性和效率。对于开发人员来说,这样的模块能够快速集成到现有项目中,减少从零开始编写这部分代码的工作...
综上所述,这个“网站源码 权限管理系统”提供了一整套的权限管理解决方案,涵盖了权限分配、数据库管理、用户界面、数据处理以及用户指南等多个方面。开发者可以通过此源码快速搭建具备权限控制功能的网站后台,...