`

用户权限控制分析

阅读更多
我们都知道或听说过已经很成熟的RBAC模型,本文也不打算针对RBAC模型阐述更多,若在阅读本文时表示对RBAC模型完全不懂的话,可以到以下这个网址了解清楚:http://baike.baidu.com/view/73432.htm

1.在RBAC模型中,有以下几个重要的概念
  • 资源(Resource):可以被标识的一切事物,例如web中用url标识的都可以称为资源,操作系统中被路径标识的文件资源。
  • 权限(Permission):操作+资源(标识)
  • 用户(User):权限的实际行使者或主体
  • 角色(Role):一系列权限的集合体

所谓的用户权限控制我想可以用这样一句简练的语句来表达吧:Who对What进行了How的操作。而很明显,Who就是用户,What就是资源,How就是操作了。
但是一般情况下用户是不会直接操作资源的,而是先成为了某种角色之后再操作资源,这时候社会更加有序。不然人人都可以对所有资源进行任何的操作,那就乱套了。
而往往,角色操作资源也是有限制的,也就是什么角色只能对什么资源作什么操作。这些也都是有规定的。
我想,这就是所谓的用户权限了吧。

既然有必要通过控制权限来维持秩序,那么权限控制必将是一门需要花心思研究的学问。
在我看来,如何抽象(或定义)“权限”是最重要的。

权限是什么?权限就是操作加上资源,在Web系统里来说,就是:权限 = Http方法+URL。
当然,这只是我的理解。

在设计的时候,需要理清RBAC模型中那些不同概念之间的关系。
  • 用户和角色是多对多的关系
  • 角色和权限也是对对多的关系
  • 权限和操作是多对一的关系
  • 权限和URL也是多对一的关系

从上面能够知道操作和URL其实是多对多的关系,权限只不过是这两者的关系而已。从而也能得到权限=操作+URL这样的结论。

下面,我尝试使用ER图和Java类图来表示它们的关系。
  • 表:User(id,name)、Role(id,name)、Permission(id,operationId,url)、Operation(id,name);
  • 多对多关联表:UserRole(id,uid,rid)、RolePerm(id,rid,pid)

试试给出这样一个应用场景:
当前系统含有两个用户:UserA、UserB
两种角色:Role1、Role2
一个资源:News(新闻资源)
对资源的操作有:查看GET,添加POST,删除DELETE,修改PUT
标志资源的url格式:
http://localhost/news
http://localhost/news/new
http://localhost/news/{id}
http://localhost/news/{id}/edit
对以上的url添加上操作就能定义出一系列的权限:

查看新闻列表权限:http://localhost/news + GET
添加新闻内容权限:http://localhost/news + POST
查看某篇新闻内容权限:http://localhost/news/{id} + GET
删除谋篇新闻权限:http://localhost/news/{id} + DELETE
修改谋篇新闻内容:http://localhost/news/{id} + PUT

当然,上面定义权限的过程完全是可由开发者在系统设置里进行定义。这里要说明的是:不一定所有的url都需要被定义为权限,当系统需要对外提供url服务时,才有必要将其定义为权限。
你一定知道一个url没有被定义成权限时它根本就没法被使用。我们需要保证这点。例如我们可以通过隐藏菜单的方式来表达某个url没有被定义成权限。当然,这仅仅是其中一种方法而已。

试想一下:
我们使用管理员账号登陆系统后台,点击“权限管理”—>“新增权限”,然后页面显示一个url列表,我们选中某个url,然后分配操作(GET、POST、DELETE、PUT)给它,接着点击保存为"权限",这时候系统把我们选中的url加上操作保存到Permission表中,并告诉我们保存成功了。这时候我们就完成了一次权限定义的操作!
接下来,我们点击“角色管理”—>“分配权限”,页面将显示一个角色列表和一个权限列表,我们选中某个角色,然后再选中某个权限(当然可以选择多个权限),接着点击"保存",系统将为我们保存到RolePerm表,并通知我们成功了,这时候我们就完成了一次权限分配的操作。
最后,我们点击“用户管理”—>“分配角色”,有点类似以上的过程,总之最后我们肯定完成了一次分配角色给用户的操作。

以上的假想过程,就完成了一次用户权限管理操作了。这时候,使用某个被赋予某种角色的用户账号进行登录,点击任何一个按钮或者在浏览器中访问任何一个url,我想系统都应该会对其进行权限判断,从而保证系统的安全之类的。

其实我想表达的也就是这些了。我明白前面举的那些UserA、UserB后来没有被我使用,但是现实就是这样的嘛,不一定被写出来的都能够被用上的,对吧。

我想我也应该在这个时候结束这篇文章了。

哦,对了,好像忘记ER图了。不过没关系,我相信ITEye的各位都懂的。


纠结了几分钟,ER图和类图就免了,但是上一下Java代码吧。

这是我使用EWeb4j框架下的持久化类写法:

Operation.java
package simportal.persistent;

import java.util.ArrayList;
import java.util.List;

import com.cfuture08.eweb4j.orm.config.annotation.Column;
import com.cfuture08.eweb4j.orm.config.annotation.Id;
import com.cfuture08.eweb4j.orm.config.annotation.Many;
import com.cfuture08.eweb4j.orm.config.annotation.Table;
import com.cfuture08.util.JsonConverter;

/**
 * 操作,Http方法,包括GET、POST、DELETE、GET
 * @author weiwei[l.weiwei@163.com]
 *
 */
@Table("t_operation")
public class Operation {
	@Id
	@Column("")
	private Integer id;
	@Column("")
	private String name;
	@Column("")
	private String description;
	//操作权限是一对多的关系
	@Many(target=Permission.class,column="operationId")
	private List<Permission> permissions = new ArrayList<Permission>();
	//省略setter&getter	
	public String toString(){
		return JsonConverter.convert(this);
	}
}


User.java
package simportal.persistent;

import java.util.ArrayList;
import java.util.List;

import com.cfuture08.eweb4j.orm.config.annotation.Column;
import com.cfuture08.eweb4j.orm.config.annotation.Id;
import com.cfuture08.eweb4j.orm.config.annotation.ManyMany;
import com.cfuture08.eweb4j.orm.config.annotation.Table;
import com.cfuture08.util.JsonConverter;

/**
 * 用户-持久化对象
 * 
 * @author weiwei[l.weiwei@163.com]
 * 
 */
@Table("t_user")
public class User {
	@Id
	@Column("")
	private Integer id;// 自增长id
	@Column("")
	private String nickName;// 昵称
	@Column("")
	private String account;// 账号
	@Column("")
	private String password;// 密码,MD5加密
	@Column("")
	private String status;// 用户状态:'在线'、'下线'、'锁定'
	@Column("")
	private String lastLoginTime;// 上一次登陆时间
	@Column("")
	private String lastLoginIp;// 上一次登陆IP
	// 用户与角色时多对多关系
	@ManyMany(target = Role.class, relTable = "t_user_role", from = "userId", to = "roleId")
	private List<Role> roles = new ArrayList<Role>();// 角色
        
        //省略setter&getter        

	public String toString() {
		return JsonConverter.convert(this);
	}
}


Role.java
package simportal.persistent;

import java.util.ArrayList;
import java.util.List;

import com.cfuture08.eweb4j.orm.config.annotation.Column;
import com.cfuture08.eweb4j.orm.config.annotation.Id;
import com.cfuture08.eweb4j.orm.config.annotation.ManyMany;
import com.cfuture08.eweb4j.orm.config.annotation.Table;
import com.cfuture08.util.JsonConverter;

/**
 * 角色-持久化对象
 * 
 * @author weiwei[l.weiwei@163.com]
 * 
 */
@Table("t_role")
public class Role {
	@Id
	@Column("")
	private Integer id;//自增长ID
	@Column("")
	private String name;//角色名称
	@Column("")
	private String description;//角色描述
	//角色用户多对多关系
	@ManyMany(target = User.class, relTable = "t_user_role", from = "roleId", to = "userId")
	private List<User> users = new ArrayList<User>();//用户
	//角色权限多对多关系
	@ManyMany(target=Permission.class,relTable="t_role_permission",from="roleId",to="permissionId")
	private List<Permission> permissions = new ArrayList<Permission>();//权限
	
        //省略setter&getter
	
	public String toString(){
		return JsonConverter.convert(this);
	}
}



Permission.java
package simportal.persistent;

import java.util.ArrayList;
import java.util.List;

import com.cfuture08.eweb4j.orm.config.annotation.Column;
import com.cfuture08.eweb4j.orm.config.annotation.Id;
import com.cfuture08.eweb4j.orm.config.annotation.ManyMany;
import com.cfuture08.eweb4j.orm.config.annotation.One;
import com.cfuture08.eweb4j.orm.config.annotation.Table;
import com.cfuture08.util.JsonConverter;

/**
 * 权限-持久化对象
 * 
 * @author weiwei[l.weiwei@163.com]
 * 
 */
@Table("t_permission")
public class Permission {
	@Id
	@Column("")
	private Integer id;// 自增长ID
	private String name;// 权限名称
	@Column("")
	private String url;// http访问url
	@Column("")
	private String description;// 描述
	//权限和操作时多对一的关系,一种操作可以形成多种权限(搭配不同的url)
	//暂时来说操作目前有GET、POST、PUT、DELETE四种操作,不排除未来会有其他操作
	@One(column = "operationId")
	private Operation operation;// 操作
	// 角色权限是多对多关系
	@ManyMany(target = Role.class, relTable = "t_role_permission", from = "permissionId", to = "roleId")
	private List<Role> roles = new ArrayList<Role>();// 角色

        //省略setter&getter

	public String toString() {
		return JsonConverter.convert(this);
	}
}

分享到:
评论
1 楼 liuxiang00435057 2012-10-17  
核心的操作没有啊,大哥,最核心的才是看点,怎么做rest的拦截都没讲

相关推荐

    用户权限管理菜单 用户权限管理菜单 用户权限管理菜单

    5. **权限审计**:为了追踪和记录用户权限的使用情况,系统通常会提供权限审计功能,便于后期分析和问题排查。 在给定的压缩包文件中,`xtglDefMenuQX.dfm` 和 `xtglDefMenuQX.pas` 可能是Delphi开发环境中使用的两...

    ArcIMS权限控制分析

    ### ArcIMS权限控制分析 #### 一、ArcIMS权限控制机制概述 ArcIMS(Arc Internet Mapping Server)是由ESRI公司开发的一款GIS(Geographic Information System)软件产品,它主要用于搭建Web GIS系统。ArcIMS提供...

    用户权限管理系统分析

    用户权限管理系统是Web开发中一个至关重要的组成部分,它主要负责控制不同用户对系统的访问和操作权限。在设计和实现这样的系统时,需要遵循一定的策略和流程,以确保系统的安全性和数据的保护。 首先,账户管理是...

    用户权限控制框架,项目记录

    在IT行业中,用户权限控制是系统安全的重要组成部分,它确保只有授权的用户才能访问特定的资源或执行特定的操作。这个“用户权限控制框架”项目记录着重于如何构建一个高效、安全且灵活的权限管理系统。 首先,我们...

    统一用户及权限管理系统需求分析

    随着信息技术的发展,企业级应用系统越来越多,每个系统都面临着用户身份验证和权限控制的问题。为了提高效率、减少重复劳动,建立一个统一用户及权限管理系统变得尤为重要。该系统不仅能够集中管理所有应用系统的...

    java写的一个权限控制的插件

    8. **源码分析**:作为学习参考,我们可以研究源码来了解其设计模式,如工厂模式、策略模式等在权限控制中的应用,以及如何使用Jaas或其他安全库实现具体功能。 总之,这个名为`jsecurity-0.9.0`的Java权限控制插件...

    asp权限控制,asp+access,含数据库文件

    ASP(Active Server Pages)是一...开发者可以参考这些代码了解如何在ASP环境中实现用户权限控制,包括登录验证、会话管理、角色分配以及数据库级别的权限设置。为了提高网站的安全性,理解和掌握这些知识点至关重要。

    计算机科学与技术(OA系统用户权限控制流程与实现)实习报告

    【计算机科学与技术(OA系统用户权限控制流程与实现)实习报告】 实习报告涉及的核心知识点集中在OA系统(Office Automation System)的用户权限控制流程及其实际实现。实习者在中山市天启电子科技有限公司实习期间...

    统一用户以及权限管理系统需求分析报告

    通过以上需求分析,我们可以看到,统一用户及权限管理系统的目标是建立一个高效、安全的用户管理平台,以满足组织内部的权限控制需求。该系统的设计和实现将直接影响到组织的信息安全和运营效率,因此,对需求的准确...

    Gitblit获取用户权限用户组权限.rar

    Gitblit支持多种级别的权限控制: 1. **全局权限(Global Permissions)**:这是一级权限,适用于整个Gitblit实例。可以设置是否允许匿名访问,以及匿名用户可执行的操作,如浏览仓库、克隆、推送等。 2. **仓库...

    opensymphony 用户权限控制系统 OSUSER 源码

    《OpenSymphony OSUSER:深度解析JAVA用户权限控制系统》 OpenSymphony OSUSER是一个基于JAVA开发的用户权限控制系统,它为开发者提供了一套强大的、灵活的权限管理框架,以实现对用户访问系统的精细化控制。OSUSER...

    关于菜单与权限控制的说明1

    在IT领域,权限控制是确保系统安全性和用户体验的关键部分。本文将详细讲解如何在C#环境中实现菜单与权限控制。 1. 角色分配:在用户管理模块,我们可以为每个用户分配一个或多个角色。超级管理员,由于其特殊地位...

    经典的用户权限管理,数据结构分析设计

    在IT行业中,用户权限管理是系统安全性的重要组成部分,它涉及到数据访问控制、角色分配以及功能权限的设置。数据结构分析设计则是实现这些功能的基础,它决定了系统的效率和可扩展性。下面将详细讨论这两个关键概念...

    前端权限控制

    3. **组件级权限控制**:对于某个具体组件的显示与否,甚至某些按钮的操作权限都可基于用户权限动态调整。 #### 项目实例分析 在实际应用中,前端权限控制的具体实现会有所不同,但基本思路大致相同。以下是一个...

    Struts2权限控制

    "基于Struts2拦截器的权限控制.doc"文档很可能是提供了一个具体的案例,详细讲解了如何创建并使用拦截器进行权限控制。文档可能会涵盖以下内容: 1. 创建自定义拦截器类,实现`Interceptor`接口,重写`intercept()`...

    Spring整合Shiro做权限控制模块详细案例分析

    Spring 整合 Apache Shiro 是一个常见的权限控制解决方案,它可以帮助开发者轻松地实现用户登录、权限验证、会话管理等功能。在这个案例中,我们将深入探讨如何将 Shiro 与 Spring 结合使用,构建一个完整的权限控制...

    基于Java EE的权限控制模型的分析和设计.pdf

    "基于Java EE的权限控制模型的分析和设计" 本文主要介绍了基于Java EE的权限控制模型的分析和设计。权限控制是信息系统中控制安全性的重要组成部分,在基于Java EE架构的企业应用中,使 用AOP(面向切面)的思想将...

Global site tag (gtag.js) - Google Analytics