首页
论坛
图书
开发资料
在线文档
网址
下载
联系我们
 新闻│Java│JavaScript│Eclipse│Eclipse 英文│J2EE│J2ME│J2SE│JSP│Netbeans│Hibernate│JBuilder│Spring│Struts
站内搜索: 请输入搜索关键词

当前页面: 开发资料首页 → Java 专题 → B/S系统权限控制的一种简单方法

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

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

</td> </tr> <tr> <td height="35" valign="top" class="ArticleTeitle">


看了网上一些关于权限控制的帖子,越看越迷糊,什么用AOP(Aspect Oriented Programming,面向方面编程),用容器,RBAC(基于角色的访问控制方法),SSO,Jive的Proxy模式等等等等,且又是role又是group,真是头都大了,先写个简单的实现方法,以后再研究高深的。
此方法不依赖容器框架,适用于小系统(主要JSP页面要少于100,因为是硬编码到JSP),适用于要精确控制页面field的情况较多的系统。

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

<table width="673" border="0"> <tr> <td width="394">

好了,进入正题!
建表:

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的集合

</td> <td width="269"> </td> </tr> </table>

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"?>
taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

1.0
1.1
security

access control!

securityForField
com.companyname.prjname.taglib.SecurityTagForField

permissionID
true


privilege


securityForPage
com.companyname.prjname.taglib.SecurityTagForPage

permissionID
true



5 修改需要控制的jsp

在jsp页面这样写:

<%@ taglib uri="/WEB-INF/securityTag.tld" prefix="security" %>
<%@ page import="com.hp.elog2.util.Util" %>

.......

<td></td>


<td></td>

......

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

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

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



function TempSave(ElementID) { CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value); CommentsPersistDiv.save("CommentXMLStore"); } function Restore(ElementID) { CommentsPersistDiv.load("CommentXMLStore"); document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent"); } </td> </tr> <tr>


↑返回目录
前一篇: 定时执行任务
后一篇: JSP实现同步的技术与实践探讨

首页 | 全站 Sitemap | 联系我们 | 设为首页 | 收藏本站
版权所有 Copyright © 2006-2007, Java 编程资料牛鼻站, All rights reserved