题外话:

  临近大四,编写各种简历的时候发现,很多电子简历上是可以链上自己在各大论坛上留下的足迹。关于这点,学习网络,拥抱开源,具有互联网思维的博主很后悔,后悔当年只会在网上查资料,不会留资料,空有才能不能表达。不过这都是往事啦,犯错早总比犯错晚好,明白错误的不早不晚也能接受。不过以后,我会尽自己所能在博客上分享一些学习到的知识。

回归正题:

  关于权限管理,各位大神都有过自己的经历,现在就让我们跟随大神的脚步慢慢深入


一. 引言

  在互联网时代,我们每天都会遇到各种权限,在你的电脑,你的手机中,你的每一次点击,每一次滑动都涉及到权限。博主高中时期最自豪的一件事,就是把当时的神机中兴u880使用线刷,把可恶的开关机铃声和一些预装软件给删了,并利用超级权限,修改手机各种图标且把自己下的软件都放到手机系统区。在Windows 操作系统中,存在用户、组的概念。当一个用户从属于Administrators 组的时候,他就能够进行操作系统的设置与修改以及安装应用程序、修改注册表等,而当一个用户从属于Guest 组的时候,就只能浏览被允许浏览的文件和运行系统管理员允许其他运行的软件。权限系统的设计在软件中普遍存在, 但现阶段世界中并没有十分完善的权限设计方法, 只有针对具体的软件需求设计出适合的权限系统。像IBM 等世界计算机巨头都在进行权限设计方面的理论研究, 虽有一些研究成果面向大型软件公司出售,但价格十分昂贵,一般消费者难以承受

二.权限介绍

  博主自以为是的认为权限直观上就是不同角色对数据具有其应有的增删该查的操作。

  每个软件都应该有这种最基本的需求。比如管理员能对数据进行增,删,查,改操作,对资源可以任意的浏览,而普通用户只能浏览限制资源,查询数据等功能。这些都包含在基本的需求当中。当然如果特殊的用户可以下载数据等这些特殊操作,这些就不在本文考虑范围之内,这都是一些可扩展工作。

  下面介绍在通用OA中关于权限的几个需要自己创建的表,以及他们的简单属性以及相互之间的关系(部分解释引用他人见解)  

  1.用户表(UserInfo)

    用户就是软件的使用者,凡是使用到该软件的都可以定义成用户。它应该有一些基本信息。

  2.角色表(RoleInfo)

    说起角色,博主一次对他有感觉是在oracle课上

      1.create role ThisRole;2.grant create table to ThisRole;3.grant ThisRole to me;

    角色就是软件使用者的身份,就像一个政府机构一样,什么样的身份,就有什么样的权利,而这里角色也就代表这用户的权限。

    角色看似挡在用户和权限中间造成麻烦,其实恰恰相反。举2个例子:1.增加一个管理员,我们需要给他分别添加增删改查;再增加一个管理员,又需要分别为其增加增删改查;如果再来很多个呢?这样无疑很麻烦。但是如果先设置一个具有管理员权限的角色,增加管理员时只要给他添加管理员角色就可以避免这个麻烦。2.公司有很多不同职位的员工,总裁,总经理,副经理,财务处长。。。。。。普通员工。这时,我们就可以看出,应该先给这些职位设置相应角色,把角色赋给对应职位上的员工,就可以减少不必要的操作。而一个真正的大公司就是这样高效稳定的运行。

  3.权限表(Action)

     权限就是对某一个资源是否有浏览的权利,或者对某一个数据是否有操作的权利。

  4.用户权限中间表(R_UserInfoAction)

    这个表有别与其它中间表,它多了一个自己设定的布尔类型的属性HasPermission.

    介绍原因:在使用vs .edmx模板创建OA关于权限的表时,每两个表是如果是多对多关系,生成数据库时,则会自动生成一个中间表,但是如果希望这个中间表具有其它操作(如软禁总经理)时,呆萌的vs并不会帮你为自动生成的中间表添加额外属性,所以需要自己创建这个表。

    对于此表图4有分析

三.权限设计

  一般常用的权限设计模式有两种

    1.基于角色

    这种方案是最常见也是比较简单的方案,不过通常有这种设计已经够了,所以微软就设计出这种方案的通用做法,可以看到微软在asp.net2.0中,就可以直接创建用户角色及用户,它不对每一个数据操作进行权限控制,而是对角色资源访问进行控制。可以指定那些角色不能访问哪些资源等,而这些权限控制配置在web.config中。可以看到这种设计方案肯定不是通用的,因为需求完全可能提出对数据的控制。例如:销售人员不能增加商品,但是可以查询修改数据。

    用户可以有多个角色,一个角色对应着多个用户,所以用户和角色之间对应关系式多对多的关系。

  

    2. 基于操作  

    这种模式下每一个操作都在数据库中有记录,用户是否拥有该操作的权限也在数据库中有记录。但是这样存在一个问题:存放这个权限记录的数据库表数据量比较大,对用户每个操作都要查询数据库,这样效率很低。

    一个用户可以拥有多种权限,一种权限也对应多个用户,所以权限与数据库之间关系式多对多的关系。

  

    但是如果直接使用上面的设计,会导致数据库中的UserAction这张表数据量非常大,所以我们需要进一步设计提高效率,请看方案3

    3.基于角色和操作的权限设计

    

    

    这下用户、角色和权限终于都齐了。这样子可以减少UserAction中的记录,并且使设计更灵活一点。

    但是这种方案在用户需求的考验之下也可能显得不够灵活够用,例如当用户要求临时给某位普通员工某操作权限时,我们就需要新增加一种新的用户角色,但是这种用户角色是不必要的,因为它只是一种临时的角色,如果添加一种角色还需要在收回此普通员工权限时删除此角色,我们需要设计一种更合适的结构来满足用户对权限设置的要求。

    4.2,3组合的权限设计,其结构如下:

  

    

    我们可以看到在上图中添加了UserAction表,使用此表来添加特殊用户的权限,改表中有一个字段HasPermission可以决定用户是否有某种操作的权限,改表中记录的权限的优先级要高于UserRole中记录的用户权限。这样在应用程序中我们就需要通过UserRole和UserAction两张表中的记录判断权限。

到这儿呢并不算完,有可能用户还会给出这样的需求:对于某一种action所操作的对象某一些记录会有权限,而对于其他的记录没有权限,比如说一个内容管理系统,对于某一些频道某个用户有修改的权限,而对于另外一些频道没有修改的权限,这时候我们需要设计更复杂的权限机制。

    5.  对于同一种实体(资源)用户可以对一部分记录有权限,而对于另外一些记录没有权限的权限设计:

   

    

    对于这样的需求我们就需要对每一种不同的资源创建一张权限表,在上图中对Content和Channel两种资源分别创建了UserActionContent和UserActionChannel表用来定义用户对某条记录是否有权限;这种设计是可以满足用户需求的但是不是很经济,UserActionChannel和UserActionContent中的记录会很多,而在实际的应用中并非需要记录所有的记录的权限信息,有时候可能只是一种规则,比如说对于根Channel什么级别的人有权限;这时候呢我们就可以定义些规则来判断用户权限(判断规则请各位看官自行脑补)

    资料来源:时间久远,存在本地,找不到链接了。。。。。。

    

.NET:权限管理的更多相关文章

  1. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  2. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  3. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  4. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

  5. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  6. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  7. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

  8. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

  9. 我的MYSQL学习心得(十三) 权限管理

    我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  10. 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

    距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...

随机推荐

  1. 从navicat for mysql导出数据库语句时应该加上的两条语句

    为了不引起编码问题,一般在从navict for mysql导出一个数据库时在文件最前面添加这2句语句: CREATE DATABASE IF NOT EXISTS `` default charac ...

  2. 06.Javascript——入门this的用法(难点)

    this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑.在实际应用中,this 的指向大致可以分为以下四种情况. 1.作为普通函数调用 当函数作为一 ...

  3. cucumber 背景和场景的区别

    背景是公用的,每个场景都会执行,相当于前提条件: 场景是一个单独的case 别人的cucumber学习总结: 链接:http://ruby-china.org/topics/7119

  4. P1816 忠诚 倍增

    链接:https://www.luogu.org/problem/show?pid=1816 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k ...

  5. nodejs 快要变成爬虫界的王者

    nodejs 快要变成爬虫界的王者 爬虫这东西是很多数据采集必须要的东西. 但是现在随着网页不断发展,已经出现了出单纯的网页,到 ajax 网页, 再到 spa , 再到 websocket 应用,一 ...

  6. kafka java api消费者

    import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties; imp ...

  7. C# DataTable的詳細用法 (转)

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...

  8. mysqlsla安装和使用介绍

    安装mysqlsla源码路径:https://github.com/daniel-nichter/hackmysql.com源码存放路径:/usr/local/src1.获取源码如果没有git命令,请 ...

  9. springMVC中ajax和后台数据格式错误

    前台ajax: $.ajax("${pageContext.request.contextPath}/hello",// 发送请求的URL字符串. { dataType : &qu ...

  10. POJ 2486 Apple Tree (树形DP,树形背包)

    题意:给定一棵树图,一个人从点s出发,只能走K步,每个点都有一定数量的苹果,要求收集尽量多的苹果,输出最多苹果数. 思路: 既然是树,而且有限制k步,那么树形DP正好. 考虑1个点的情况:(1)可能在 ...