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

原创 2004年07月21日 11:26:00
看了网上一些关于权限控制的帖子,越看越迷糊,什么用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,共同研究!

【系统设计】B/S 简单商业系统License控制解决方案之一

B/S系统简单License控制 背景:            目前主流商用的系统软件都存在License控制的功能,最主要的目的是为了满足开发商的盈利,作为一种试用、销售的策略。其二 就是为了...
  • sweetyone
  • sweetyone
  • 2014年09月11日 01:19
  • 1436

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

所谓"B/S"是指Browser/Server(浏览器/服务器),即客户端是标准的浏览器(如Internet Explore,Netscape Navigator等),服务器端为标准的WEB服务器协同...
  • root_robot
  • root_robot
  • 2016年11月04日 21:41
  • 710

基于B/S的信息管理系统的架构技术介绍

如果要实现一个拥有图表 菜单栏 下拉框 信息管理 权限登陆...的B/S系统,你需要哪些东西? 1.服务器 既然是网站,那么总要有个可以运行的服务器。选择Tomcat服务器,开发过程可以选择免安装...
  • lin370
  • lin370
  • 2014年10月28日 20:30
  • 5175

B/S系统界面设计与开发详解

早在中国IT业方兴未艾之时,计算机应用系统主要以功能实现为主,几乎没有界面设计这个概念。时至今日,随着计算机和网络的不断普及,社会信息化程度日益加深,用户和市场的不断成熟,人们已经不仅仅满足于“够用”...
  • Eleven204
  • Eleven204
  • 2013年08月24日 12:53
  • 3929

B/S系统远程部署项目的方法和装置

B/S系统远程部署项目的方法和装置 摘要 本发明公开了一种B/S系统的远程安装部署的方法及装置。所述方法包括:第一计算机将运输程序远程部署到第二计算机,运输程序中携带非脚本语言编写的代...
  • yidaizongshi579
  • yidaizongshi579
  • 2016年01月09日 13:26
  • 1081

B/S系统的前台和后台数据转递机制探究

一个B/S系统的前台和后台是如何进行数据传递的呢?即前台如何把用户的输入传递给后台,后台又是如何把处理结果发送回前台,比如你登录google网站,输入一个关键字,google网站如何把你输入的关键字传...
  • clever101
  • clever101
  • 2014年03月21日 09:04
  • 3636

基于B/S模式的设备管理系统开发

摘  要:介绍了基于B/S模式的设备管理系统的结构组成与功能特点,为煤炭生产企业各级设备管理部门进行设备的管理提供了便捷可靠的信息管理系统。 关键词:设备管理   B/S模式  机电设备 0.引言...
  • guanhui1997
  • guanhui1997
  • 2016年07月11日 11:49
  • 816

构建B/S模式的WebGIS 系统开发框架知多少

构建B/S模式的WebGIS 系统开发框架知多少 1.1 构建基本的B/S模式的WebGIS框架      GIS经历了从单机环境应用向网络环境应用发展的过程,网络环境GIS应用从局域网内客户...
  • sinat_34719507
  • sinat_34719507
  • 2017年03月08日 23:24
  • 2409

B/S项目学习总结

B/S项目学习完之后一直欠一个总结,用时7个月才结束了这个项目,真的是相当的漫长,半年多的时间在学习B/S的过程中又成长了不少,总结总结这段时间学习的感受和收获。         【记录】      ...
  • u013046097
  • u013046097
  • 2016年01月18日 20:02
  • 1258

B/S模型基本架构

B/S是一种常见的客户端与服务器的交互模型,具有很多优点,这些优点使得它越来越流行。B/S模型具有以下优点:   客户端:客户端使用主要是浏览器,浏览器为用户提供了统一的操作平台,即对于不同的服务器...
  • xiaofangzi11
  • xiaofangzi11
  • 2016年11月22日 13:41
  • 1219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:B/S系统权限控制的一种简单方法
举报原因:
原因补充:

(最多只允许输入30个字)