Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 337|回复: 0

[jsp学习]B/S系统权限控制的一种简单方法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 12:12:24 | 显示全部楼层 |阅读模式
    看了网上一些关于权限控制的帖子,越看越迷糊,什么用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 )
    1. UserProfile.java:
    2. package com.××.××.××;
    3. import java.util.Collection;
    4. public class UserProfile {
    5.   private String userId;
    6.   private String userType;
    7.   private String companyNo;
    8.   private String companyName;
    9.   private String companyType;
    10.   private Collection userPermissions;
    11. public String getUserId() {
    12.        return userId;
    13.   }
    14.   public void setUserId(String userId) {
    15.       this.userId = userId;
    16.   }
    17. public String getUserType() {
    18.        return userType;
    19. }

    20.   public void setUserType(String userType) {
    21.      this.userType = userType;
    22.   }
    23.   public String getCompanyNo() {
    24.       return companyNo;
    25.   }
    26.   public void setCompanyNo(String companyNo) {
    27.       this.companyNo = companyNo;
    28.   }
    29.   public String getCompanyName() {
    30.     return companyName;
    31.   }
    32.    public void setCompanyName(String companyName) {
    33.      this.companyName = companyName;
    34.    }
    35.    public String getCompanyType() {
    36.      return companyType;
    37.    }
    38.   public void setCompanyType(String companyType) {
    39.      this.companyType = companyType;
    40.   }
    41.   public Collection getUserPermissions() {
    42.      return userPermissions;
    43.   }
    44.    public void setUserPermissions(Collection userPermissions) {
    45.       this.userPermissions = userPermissions;
    46.    }
    47. }
    48. UserPermission.java:
    49. package com.××.××.××;
    50. public class UserPermission {
    51.   private int permissionId;
    52.   private String privilege;
    53.   public int getPermissionId() {
    54.      return permissionId;
    55.   }
    56.   public void setPermissionId(int permissionId) {
    57.      this.permissionId = permissionId;
    58.   }
    59.   public String getPrivilege() {
    60.      return privilege;
    61.   }
    62.   public void setPrivilege(String privilege) {
    63.     this.privilege = privilege;
    64. }
    65. }
    66. 3 加两个Tag(Page与Field):
    67. SecurityTagForPage.java:
    68. package com.**.**.taglib;
    69. import java.util.*;
    70. public class SecurityTagForPage extends TagSupport{
    71. private int permissionID;
    72. public int doEndTag() throws JspException{
    73.      HttpSession session = pageContext.getSession();
    74.      //登陆时把该user的userProfile放到session里
    75.      UserProfile userProfile = (UserProfile)session.getAttribute("userProfile");
    76.      Collection collection= userProfile.getUserPermissions();
    77.      Iterator it = collection.iterator() ;
    78.      while(it.hasNext()){
    79.        UserPermission userPermission = (UserPermission)it.next();
    80.        if ((permissionID == userPermission.getPermissionId())){
    81.             return EVAL_PAGE;
    82.        }
    83.      }
    84.      return SKIP_PAGE;
    85. }
    86. public int getPermissionID(){
    87.      return permissionID;
    88. }
    89. public void setPermissionID(int permissionID){
    90.      this.permissionID = permissionID;
    91. }
    92. }
    93. SecurityTagForField:
    94. public class SecurityTagForField extends TagSupport{
    95.   private int permissionID;
    96.   private String privilege;
    97. public int doStartTag() throws JspException{
    98.   HttpSession session = pageContext.getSession();
    99.   UserProfile userProfile = (UserProfile)session.getAttribute("userProfile");
    100.   Collection collection= userProfile.getUserPermissions();
    101.   Iterator it = collection.iterator() ;
    102.   while(it.hasNext()){
    103.      UserPermission userPermission = (UserPermission)it.next();
    104.      if (privilege ==null){
    105.             if ( (permissionID == userPermission.getPermissionId())){
    106.                  return EVAL_BODY_INCLUDE;
    107.             }
    108.      }else{
    109.         if ((permissionID == userPermission.getPermissionId())
    110. &&(privilege.equals(userPermission.getPrivilege()))){
    111.             return EVAL_BODY_INCLUDE;
    112.         }
    113.      }
    114.    }
    115.    return SKIP_BODY;
    116.   }
    117. public int getPermissionID(){
    118.   return permissionID;
    119. }
    120. public void setPermissionID(int permissionID){
    121.    this.permissionID = permissionID;
    122. }
    123. public String getPrivilege(){
    124.    return privilege;
    125. }
    126. public void setPrivilege(String privilege){
    127.     this.privilege = privilege;
    128. }
    129. }
    复制代码
    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,共同研究!
      

      
      
       
       

         
       

         
       
      



    源码下载:http://file.javaxxz.com/2014/10/1/121223812.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-1 19:41 , Processed in 0.401416 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表