`
isiqi
  • 浏览: 16616966 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
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太多,但结构简单,思路清晰,适用范围广。

分享到:
评论

相关推荐

    c#b/s通用功能权限管理系统,带源码

    C# B/S通用功能权限管理系统的核心在于权限控制模块,它通常采用RBAC(Role-Based Access Control,基于角色的访问控制)模型。在这个模型中,系统首先定义好各种角色及其对应的权限,然后根据用户的角色来决定用户...

    基于B/S库存管理系统

    【基于B/S库存管理系统】是一种采用浏览器/服务器(B/S,Browser/Server)架构的库存管理解决方案。在这样的系统中,用户通过Web浏览器进行操作,而数据处理和业务逻辑则集中在服务器端进行,大大简化了客户端的需求...

    B/S网盘系统

    【B/S网盘系统】是一种基于浏览器/服务器(Browser/Server)架构的网络存储系统,它允许用户通过Web浏览器访问、存储和管理自己的文件。这种系统的核心特点是无需安装客户端软件,只需要一个支持JavaScript的现代...

    C#图书管理系统b/s结构

    B/S架构是一种网络应用模式,用户通过浏览器进行操作,服务器端处理业务逻辑和数据管理。在C#图书管理系统中,用户无需安装客户端软件,只需打开网页即可进行图书借阅、归还、查询等操作,大大降低了维护成本。...

    论文研究-基于角色访问控制在B/S系统中的应用与实现 .pdf

    基于角色访问控制(RBAC)是一种在...RBAC模型的发展和完善,为B/S模式等信息系统提供了一种有效的权限管理解决方案,能够支持组织内部复杂角色关系的映射和权限控制需求,满足现代信息系统安全性和灵活性的双重要求。

    b/s管理系统网站模板

    在信息技术领域,B/S(Browser/Server,浏览器/服务器)架构是一种广泛应用的软件系统架构模式。它通过浏览器作为客户端,与服务器端进行交互,大大简化了用户端的维护工作,使得系统开发和维护更加便捷。本资源提供...

    B/S架构的权限管理系统 数据库Access

    在IT行业中,B/S(Browser/Server,浏览器/服务器)架构是一种常见的软件系统设计模式,它将用户界面和业务逻辑分离,用户通过浏览器进行交互,而服务器负责处理数据和业务逻辑。这种架构模式大大简化了客户端的需求...

    基于B/S的资料管理系统设计论文

    本文旨在探讨一种基于浏览器/服务器(B/S)架构的资料管理系统的设计与实现。随着信息技术的发展和网络技术的进步,B/S架构因其易于部署、维护成本低等优势,在各类信息系统开发中得到了广泛应用。本论文通过对B/S...

    基于b/s的图书管理系统毕业设计源码

    1. **B/S架构**:B/S(Browser/Server)架构是一种客户端-服务器模式,用户通过浏览器访问服务器上的应用,无需在本地安装任何软件,降低了用户的使用门槛。这种架构使得系统维护和升级更为便捷,只需更新服务器端...

    b/s在线文件管理系统

    【标题】"B/S在线文件管理系统"是一种基于浏览器/服务器(Browser/Server)模式的文件管理解决方案,它允许用户通过Web界面进行文件的上传、下载、查看、编辑、删除等操作,无需安装任何客户端软件。这种系统的核心...

    基于B/S的生产系统管理

    研究论文中,作者们通过对C/S和B/S两种模式的深入对比分析,明确指出了B/S模式在生产管理信息系统开发中的优越性,并对其关键技术进行了详尽阐述。 #### 关键技术与实现 在系统实现阶段,B/S架构的核心优势在于其...

    员工信息管理系统(B/S结构)

    员工信息管理系统是一种常见的企业应用系统,它以B/S(Browser/Server,浏览器/服务器)架构为基础,旨在高效管理企业的员工数据,实现人力资源的有效配置。在这个系统中,用户通过浏览器进行操作,而系统的核心处理...

    基于B/S模式的网上购物系统

    【基于B/S模式的网上购物系统】是一种广泛应用的电子商务平台,它基于Browser/Server(浏览器/服务器)架构,用户只需通过浏览器即可实现在线购物、商品浏览、订单处理等一系列功能。这种模式大大降低了用户使用系统...

    基于Java的B/S结构的人力资源管理系统实现+java源码+Sql数据+页面

    《基于Java的B/S结构人力资源管理系统实现》 在信息技术飞速发展的今天,企业对人力资源管理的需求日益增强,而基于B/S(Browser/Server)架构的人力资源管理系统因其便捷性、高效性和可扩展性,成为了企业管理的...

    C/S结构与B/S结构的区别

    C/S(Client/Server)结构和B/S(Browser/Server)结构是两种常见的软件系统架构,它们在多个方面有着显著的差异。 首先,C/S结构是基于局域网的,通常用于内部网络环境,其中客户端(Client)负责用户界面和部分...

    基于B/S模式图书馆管理系统

    【基于B/S模式图书馆管理系统】是一种采用Browser/Server(浏览器/服务器)架构的图书信息管理解决方案,它将传统的客户端应用程序转换为通过Web浏览器进行访问和操作。这种模式大大简化了用户的使用过程,只需要一...

    B/S结构和C/S结构

    **B/S结构**(Browser/Server,浏览器/服务器模式)是一种随着Web技术发展而兴起的网络结构模式。在此模式下,客户端的主要应用软件为Web浏览器,例如Netscape Navigator或Internet Explorer等。系统功能实现的核心...

    后台管理系统界面b/s模式

    【后台管理系统界面b/s模式】是一种基于浏览器/服务器(Browser/Server)架构的系统设计模式,主要用于企业级应用。在B/S模式下,用户通过Web浏览器访问和操作系统的各项功能,而无需安装特定的客户端软件。这种模式...

    web报表B/S

    Web报表B/S系统是一种基于浏览器/服务器架构的报表解决方案,主要应用于数据分析、数据展示和决策支持。这种系统允许用户通过Web界面访问和交互各种报表,无需安装任何客户端软件,极大地提高了报表的分发效率和使用...

Global site tag (gtag.js) - Google Analytics