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

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

 
阅读更多
看了网上一些关于权限控制的帖子,越看越迷糊,什么用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太多,但结构简单,思路清晰,适用范围广。

分享到:
评论

相关推荐

    本科毕业论文 基于B/S的ERP人力资源管理子系统的设计与开发

    本科毕业论文 基于B/S的ERP人力资源管理子系统的设计与开发 目 录 摘要 III 关键词 III Abstract III Key Words III 前言 1 1 相关介绍 1 1.1框架介绍 1 1.2 Struts框架介绍 2 1.3 Hibernate框架介绍 2 1.4 Spring...

    基于J2EE的B/S系统的权限控制设计 (2005年)

    针对传统权限控制设计的问题,提出了一种基于J2EE的B/S系统的权限控制设计。它通过虚拟扩展数据库系统的外模式和虚拟实现数据库的用户授权模式,在数据库连接.IDBC与Web的应用服务之间增加数据过滤层,很好地解决了...

    毕业设计管理系统, 采用B/S模式

    系统的组织架构如图所示,三种用户根据自己不同的权限对课题、文档、成绩、公告、任务五种数据信息进行处理,不同用户角色再根据这些数据信息进行交互通过课题进行交互,并且围绕着文档进行数据的传递和处理等。

    vb.net开发的C/S结构超市管理系统

     市场上的connie’s store系统软件已具有比较完善的技术,但本软件采用了具有创新思维的vb程序设计语言,它将复杂的程序设计语言简单化,直观化,是一种通用的计算机程序设计语言。通过开展此工程,培养我们的团体...

    基于JAVA jspOA办公自动化系统的毕业设计,采用B/S架构,运用JAVA jsp技术实现,使用MySQL作为后台数据库

    一个基于JAVA jsp的办公自动化系统,提供一种高效、可靠、方便的工作方式,以满足现代企业的需求。本系统将集成多种功能,包括但不限于: - 员工管理:实现员工信息的录入、编辑、查询、删除等操作,以及员工考勤、...

    基于角色的权限管理系统视频教程

    本套教程通过c-s和b-s两种模式讲解,如果没有学过winform开发的学员可以通过本套教程补充下winform开发知识,以桌面程序的方式实现数据的CRUD操作,同时还可以学会一些常用控件的使用,特别是树形菜单的使用,以及...

    毕业设计:某中学学生成绩管理系统的设计(源代码)

    B/S结构利用不断成熟和普及的浏览器技术实现原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。这种结构更成为当今应用软件的首选体系结构,Microsoft.net也是在这样一种...

    OA系统权限管理设计方案

    通过角色 赋予权限,是指没办法按职位或项目的分类来赋予权限的另一种方式,如:系统管理员,资 料备份员… b) 实例中:对于本系统中,全体人员应该默认都有的模块,如我的邮件,我的文档,我的 日志,我的考勤...

    数据库权限设计与实现.doc

    传统业务系统中,存在着两种权限管理,其一是功能权 限的管理,而另外一种则是资源权限的管理,在不同系统之间,功能权限是可以重 用的,而资源权限则不能。 关于设计 借助NoahWeb的动作编程理念,在设计阶段,系统...

    java用户角色权限设计.doc

    实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户 的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一 台计算机都已具备的...

    java用户角色权限设计.doc.doc

    传统业务系统中,存在着两种权限管理,其一是功能权限 的管理,而另外一种则是资源权限的管理,在不同系统之间,功能权限是可以重用的, 而资源权限则不能。 关于设计 而这两张表起着映射的作用,分别是"actiongroup...

    全管C5-OA协同办公系统

    在角色权限的基础上,结合组织结构扩展出四类角色:部门、职位、人员组及职员,可分别对这四种角色设置权限,系统自动合并计算出最终权限。与传统单一维度权限机制相比,多维度权限机制功能更强大,管理效率也更高,...

    某中学学生成绩管理系统的设计

    本毕业设计所描述的中学学生成绩管理系统是采用ASP.NET作为网络编程框架,SQL Server 2000作为数据库编写的一个B/S模式的系统。系统主要实现了:用户管理、成绩查询、成绩管理和科目管理等功能。本文详细介绍了中学...

    酒店预订系统毕业设计整套

    该系统具有预定酒店资源、查看订单、留言、查看酒店信息、订单信息管理、资源信息管理、分组管理以及管理员权限管理等重要功能,使得游客无论在哪里都可以及时预定到想要的酒店,而且很快就知道预定结果,这是对当今...

    教学管理系统论文(带源代码)

    目前开发Web应用程序主要有C/S(客户机/服务器)和B/S(浏览器/服务器)两种模式。B/S设计模式为我们提供了系统设计的基本思想和基本方向。相对于C/S模式来讲,B/S 模式让客户端不安装软件通过对服务端的访问就可以...

    Module Framework Design 2008(模块化开发框架)

    Module Framwork Design 2008 是一个集成式的 B/S 免费开发工具,帮助企业快速设计应用系统,集成了日志、联接池、性能优化、权限控制、数据展现,常规模块功能(增加、删除、修改、查询、导出、排序)实现,采用JAVA...

    325-基于springboot+vue的物流配送管理系统(源码+数据库)

    随着社会经济不断的发展,很多行业都发生了很大的变化,各种管理系统层出不穷,关于物流管理配送的管理系统也是其中的一种。近几年来,随着各行各业计算机智能化管理的转型,以及人们生活中物流信息的不断增多,物流...

    基于人脸识别的课程考勤管理系统设计与实现文档.zip

    而基于人脸识别技术的课程考勤系统则能够有效解决这些问题,为学校和教师提供了一种更加高效、准确的管理方式 2.技术介绍 本章主要介绍了人脸识别技术中Dlib函数包和OpenCV函数包;另外,对比C/S和B/S系统架构的优...

    管理员-数据库设计.doc

    传统业务系统中,存在着两种权限管理,其 " "一是功能权限的管理,而另外一种则是资源权限的管理,在不同系统之间 " ",功能权限是可以重用的,而资源权限则不能。 " "关于设计 " " 借助NoahWeb的动作编程理念,在...

    论文研究-一种基于ASP的动态用户权限管理解决方案.pdf

    以医院网上医疗管理信息系统的研究和开发为背景,针对专家答疑系统的安全问题,对B/S模式下系统用户权限管理的需求进行了分析,采用结构化方法和基于角色的安全管理策略进行了系统功能和业务流程的设计,并采用ASP等...

Global site tag (gtag.js) - Google Analytics