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文件,

网R管C8Hx软供Tq.Rh$理
?0~教F":iL无:`专$R=`PU
q提教Q无!件iudDCUz"dzT
内容如下:(改一下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太多,但结构简单,思路清晰,适用范围广。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值