分享
 
 
 

B/S系统权限控制的一种简单方法

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

看了网上一些关于权限控制的帖子,越看越迷糊,什么用AOP(Aspect Oriented Programming,面向方面编程),用容器,RBAC(基于角色的访问控制方法),SSO,Jive的Proxy模式等等等等,且又是role又是group,真是头都大了,先写个简单的实现方法,以后再研究高深的。

此方法不依赖容器 框架,适用于小系统(主要JSP页面要少于100,因为是硬编码到JSP),适用于要精确控制页面field的情况较多的系统。

(插句话:要分清权限控制与业务逻辑,业务逻辑就是情况由系统运行时的某些条件决定,如学生管理系统中,某一学生进入系统,只能看自己的记录,因为可看的记录是由学号来决定的,所以这是业务逻辑,而又如学生不能看老师的记录,这是有学生的身份来决定的,所以这是权限控制。)

好了,进入正题!

建表:

user(user信息: userID userPassword 等)

role(role描述:roleID roleDesc)

permission(permission描述:permissionID permissionDesc)

user-role(user role对应关系表:userID roleID)

role-permission(role permission对应关系表:roleID permissionID)

user-permission(user permission对应关系表:userID permissionID)

重要申明:

1 此处role没有继承关系,只是permission的集合

2 user-permission表只是为了方便,其数据是根据user-role role-permission两表得来,只有在user-role role-permission两表有更新的时候更新此表,并不能单独赋予user某个permission,只能赋予user一个或多个role。

3 permission的分配,这是一个难点,很多比较复杂的权限控制系统也是因为这个才发展出来,此处把它尽量想简单,不考虑业务逻辑,以页面为视角,分两层,首先是需要控制的jsp页面,然后是需要控制的页面field(包括link,text,textbox,button等等),field这一层还有privilege之分(R和W,即可读和可写)

基本思路:进入JSP页面时,检查用户信息,查到用户有此permission就包含此代码,如果没有此permission就不包含此代码,此功能由Tag来完成(不会写Tag?不要紧,抄!)。看代码吧!

1 建表(如上)

2 建两个class(bean) (UserProfile是用户基本信息 UserPermission是permission )

UserProfile.java:

package com.××.××.××;

import java.util.Collection;

public class UserProfile {

private String userId;

private String userType;

private String companyNo;

private String companyName;

private String companyType;

private Collection userPermissions;

public String getUserId() {

return userId;

}

public void setUserId(String userId) {

this.userId = userId;

}

public String getUserType() {

return userType;

}

public void setUserType(String userType) {

this.userType = userType;

}

public String getCompanyNo() {

return companyNo;

}

public void setCompanyNo(String companyNo) {

this.companyNo = companyNo;

}

public String getCompanyName() {

return companyName;

}

public void setCompanyName(String companyName) {

this.companyName = companyName;

}

public String getCompanyType() {

return companyType;

}

public void setCompanyType(String companyType) {

this.companyType = companyType;

}

public Collection getUserPermissions() {

return userPermissions;

}

public void setUserPermissions(Collection userPermissions) {

this.userPermissions = userPermissions;

}

}

UserPermission.java:

package com.××.××.××;

public class UserPermission {

private int permissionId;

private String privilege;

public int getPermissionId() {

return permissionId;

}

public void setPermissionId(int permissionId) {

this.permissionId = permissionId;

}

public String getPrivilege() {

return privilege;

}

public void setPrivilege(String privilege) {

this.privilege = privilege;

}

}

3 加两个Tag(Page与Field):

SecurityTagForPage.java:

package com.**.**.taglib;

import java.util.*;

public class SecurityTagForPage extends TagSupport

{

private int permissionID;

public int doEndTag() throws JspException

{

HttpSession session = pageContext.getSession();

//登陆时把该user的userProfile放到session里

UserProfile userProfile = (UserProfile)session.getAttribute("userProfile");

Collection collection= userProfile.getUserPermissions();

Iterator it = collection.iterator() ;

while(it.hasNext())

{

UserPermission userPermission = (UserPermission)it.next();

if ((permissionID == userPermission.getPermissionId()))

{

return EVAL_PAGE;

}

}

return SKIP_PAGE;

}

public int getPermissionID()

{

return permissionID;

}

public void setPermissionID(int permissionID)

{

this.permissionID = permissionID;

}

}

SecurityTagForField:

public class SecurityTagForField extends TagSupport

{

private int permissionID;

private String privilege;

public int doStartTag() throws JspException

{

HttpSession session = pageContext.getSession();

UserProfile userProfile = (UserProfile)session.getAttribute("userProfile");

Collection collection= userProfile.getUserPermissions();

Iterator it = collection.iterator() ;

while(it.hasNext())

{

UserPermission userPermission = (UserPermission)it.next();

if (privilege ==null)

{

if ( (permissionID == userPermission.getPermissionId()))

{

return EVAL_BODY_INCLUDE;

}

}

else

{

if ((permissionID == userPermission.getPermissionId())

&&(privilege.equals(userPermission.getPrivilege())))

{

return EVAL_BODY_INCLUDE;

}

}

}

return SKIP_BODY;

}

public int getPermissionID()

{

return permissionID;

}

public void setPermissionID(int permissionID)

{

this.permissionID = permissionID;

}

public String getPrivilege()

{

return privilege;

}

public void setPrivilege(String privilege)

{

this.privilege = privilege;

}

}

4 在web-inf目录下建个securityTag.tld文件,内容如下:(改一下class的目录)

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<!-- a tag library descriptor -->

<taglib>

<tlibversion>1.0</tlibversion>

<jspversion>1.1</jspversion>

<shortname>security</shortname>

<uri/>

<info>

access control!

</info>

<tag>

<name>securityForField</name>

<tagclass>com.companyname.prjname.taglib.SecurityTagForField</tagclass>

<attribute>

<name>permissionID</name>

<required>true</required>

</attribute>

<attribute>

<name>privilege</name>

</attribute>

</tag>

<tag>

<name>securityForPage</name>

<tagclass>com.companyname.prjname.taglib.SecurityTagForPage</tagclass>

<attribute>

<name>permissionID</name>

<required>true</required>

</attribute>

</tag>

</taglib>

5 修改需要控制的jsp

在jsp页面这样写:

<%@ taglib uri="/WEB-INF/securityTag.tld" prefix="security" %>

<%@ page import="com.hp.elog2.util.Util" %>

<security:securityForPage permissionID="36" />

.......

<security:securityForField permissionID="46" privilege="R">

<td><html:text name="formBean" property="property1" readonly="true" /></td>

</security:securityForField>

<security:securityForField permissionID="46" privilege="W">

<td><html:text name="formBean" property="property1" /></td>

</security:securityForField>

......

这样就大功告成了,建议在所有jsp页面完成后再做权限控制这一块(添加Tag),主要都是些Copy+C和Copy+V的工作。

此方法最大的问题就是hardcode太多,但结构简单,思路清晰,适用范围广。

复杂的方法希望同道之士于我联系leon_sandy@tom.com,共同研究!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有