B/S系统权限控制的一种简单方法
来源:互联网 发布:软件考试程序员考什么 编辑:程序博客网 时间:2024/04/29 05:18
此方法不依赖容器 框架,适用于小系统(主要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太多,但结构简单,思路清晰,适用范围广。
- B/S系统权限控制的一种简单方法
- B/S系统权限控制的一种简单方法
- B/S系统权限控制的一种简单方法
- B/S系统权限控制的一种简单方法
- B/S系统权限控制的一种简单方法
- 实现权限控制的一种方法
- 实现数据权限控制的一种方法
- Delphi 一种简单的二进制校验方法,适用于简单的权限管理或开关控制
- 简单客户系统的权限控制实现
- 简单客户系统的权限控制实现
- 一种基于注解的Spring MVC权限控制方法
- 一种基于注解的Spring MVC权限控制方法
- 一种基于annotation的Spring-mvc权限控制方法
- 一种简单方便的权限管理方法--使用菜单
- 【系统设计】B/S 简单商业系统License控制解决方案之一
- B/S系统权限组设计方案
- .NET20 一种简单的窗口控件UI状态控制方法
- .NET20 一种简单的窗口控件UI状态控制方法
- 等咱有了钱
- 用Javascript检查客户端是否安装某个软件
- 同时删除多个文件
- 关于权限设计的探讨
- 快速一次性读取ORACLE CLOB的方法
- B/S系统权限控制的一种简单方法
- 编著书籍推荐表
- 关于用户角色权限
- 玫瑰下的阿司匹林
- DELPHI中动态获得SQLSERVER数据库名
- 爱情的余温
- 格式化小数位及日期
- 树操作
- 权限系统概要