C#权限管理和设计浅谈

此文主要想和大家分享的是这段时间,对权限管理和设计的断断续续的思考学习,和个人的一些软件开发等方面的看法。

提到'权限管理和设计',大家可能会第一时间想到这园子里的 吉日嘎拉,在这方面他可以算是'大牛'或专家 ——他的'通用权限管理系统',究竟做的怎样,看看他的博客就差不多可以知道了(貌似我在给他做推广,呵呵...,but in fact,is not),别的暂且不敢说,最起码可以看出他研究的比较深入和狂热,其系统也具有一定的'成熟度',用他的话来说——就是在努力做到他的极致。他做的是通用权限管理系统,那么何为‘通用'?我谈下个人的理解:

a. (主流)数据库通用 ——即利用工厂等模式,可以方便适应不同(类型的)数据库,保证软件的可移植性。这点重点在数据库设计上!

b. 权限管理和判断 思想上的通用,相同解决或实现方法 or 思路 可以用在不同的开发语言和项目类型(大的方面 如:b/s 和 c/s)上,像吉日的权限系统 ——这方面,通用在,可应用在C#语言开发的web和WinForm程序中。 ——我个人认为:(实现上的)思想(或称之为 解决方案)通用更为重要,就像是一个不错的 购物车的实现思路或方案,可以很好的用在php、jsp、C#等语言开发的项目中。【问题的解决方案基本上与编程语言无关,不同的只是实现】。

我对权限管理和设计的思考和学习,其主要目的想:能在以后的项目开发中,利用自己的想法或(开发出)类似吉日兄弟的‘权限管理系统',可以快速有效的实现软件中的权限管理部分(个人目前对权限管理部分感觉还是件挺棘手的事情)。而学习和思考,我并不是仅仅局限于自己的(空)想法,也学习和研究一些 我自己感觉可完善自己的思路、可借鉴的项目案例,像:吉日的权限系统,(通用权限管理系统)FrameWork104Src,MemberShip,phpcms,ecshop等 ——但由于时间的关系,目前只粗略的看了下前面的两个。【思考和学习,或是研究,我建议的方法是:先自己确定或理出大概的思路,再借鉴和参考学习其它与你所研究方向相同的项目案例(最好是大型 具有一定的'成熟度'的项目),以完善自己的思路,(对参考项目)扬长补短,这样你的研究才能站在一个较高的起点(可称之为‘站在巨人的肩膀上',呵呵),且研究的结果也不至于'太失败';因为你的想法就是再好再独特,你也无法考虑周全,可能你自以为不错的想法,只能算是考虑到了问题某一方面的,与优秀的相比就没有可比性。比如:之前有人找我给他开发CMS系统,我就建议他:CMS系统如果想做好不是一个人能能完成的,是个比较庞大的工程,如果真想自己开发,最好借鉴下phpcms等流行的CMS系统,要不然做出来的东西 无论是功能上 还是易用性上,可能都不及人家一半。做项目或研究,不能盲目的去做,要多参考和学习优秀的项目,否则你的项目或研究就会'死'在开发上!】。


代码如下:

/// <summary>
/// 获得用户的权限,操作权限
/// </summary>
private void GetPermission()
{
this.DbHelper.Open();

// 用户的操作权限
this.btnUserAdd.Enabled = this.IsAuthorized("User.Add");
this.btnUserDelete.Enabled = this.IsAuthorized("User.Delete");
this.btnUserExport.Enabled = this.IsAuthorized("User.Export");
this.btnUserImport.Enabled = this.IsAuthorized("User.Import");
this.btnUserPrint.Enabled = this.IsAuthorized("User.Print");
this.btnUserUpdate.Enabled = this.IsAuthorized("User.Update");
// 角色的操作权限
this.btnRoleAdd.Enabled = this.IsAuthorized("Role.Add");
this.btnRoleDelete.Enabled = this.IsAuthorized("Role.Delete");
this.btnRoleExport.Enabled = this.IsAuthorized("Role.Export");
this.btnRoleImport.Enabled = this.IsAuthorized("Role.Import");
this.btnRolePrint.Enabled = this.IsAuthorized("Role.Print");
this.btnRoleUpdate.Enabled = this.IsAuthorized("Role.Update");

this.DbHelper.Close();
}

如上是 吉日的权限系统Permission项目中的一段代码,其作用,大家一看便知——根据当前登录用户的权限,判断页面上的按钮是否可用,之所以帖出来,是因为我个人感觉:这段代码不够简洁有效,建议可以考虑用集合来处理判断权限[这也是我已基本上考虑好,在自己的研究中可行 简单的方法,具体的想法还需要进一步整体考虑后,再和大家交流]。

在看(通用权限管理系统)FrameWork104Src系统时,也感觉其权限判断处理上有些繁琐,更重要的是,发现了一个bug——可能在不少软件中,都容易疏忽的地方——权限判断不够彻底。好的权限管理的实现,其结果应该是确保软件足够的安全,(从根源上)禁止用户"做他不能做的事"。此bug就是:我以A用户的身份登录系统后,此用户没有添加会员的权限,但我为了测试其权限控制的是否够彻底,直接在Url中访问 添加会员页面,谁知,进去了,不过,还好的是 在点击确定按钮时弹出'没有此操作权限'的提示 ——所以,在这里提醒下,目前正在做权限管理功能或模块的朋友,请检查下你软件中权限管理是否够安全彻底。操作按钮等不可见或不可用,并不能从根源上控制‘用户'操作,一定要在提交的方法或处理中加上权限判断。就像是:登录或注册等页面的提交js验证,无论写的多么完善或强大,都必须在后台代码中加必要的判断!

好了,暂时就写到这儿吧,(发现有时用心写篇博客,很需要时间,呵呵),希望有在做这方面研究的朋友多提意见!

(0)

相关推荐

  • C#引用访问权限分析

    本文实例分析了C#引用访问权限问题.分享给大家供大家参考.具体分析如下: 同样代码表现的不同行为:   创建基类(Super)和派生类(Sub)每个类有一个字段field和一个公共方法getField,并且使用内联的方式初始化为1,方法getField返回字段field.C#和Java代码及运行结果如下 复制代码 代码如下: class Super {         public int field = 0;           public int getField()         {

  • C#判断程序是否是管理员权限运行的方法代码示例

    public bool IsAdministrator() { WindowsIdentity current = WindowsIdentity.GetCurrent(); WindowsPrincipal windowsPrincipal = new WindowsPrincipal(current); return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); }

  • C#利用WMI操作DNS服务器(可远程操作,需要相应权限)

    using System; using System.Collections.Generic; using System.Text; using System.Data; namespace Yaosansi {     class Test     {         static void Main()         {             MyDnsTEST();         } /// <summary>     /// MyDnsTEST功能测试   /// C#利用WMI

  • 采用C#代码动态设置文件权限

    在开发中,我们经常会使用IO操作,例如创建,删除文件等操作.在项目中这样的需求也较多,我们也会经常对这些操作进行编码,但是对文件的权限进行设置,这样的操作可能会手动操作,现在介绍一种采用代码动态对文件设置权限的操作. 在对文件进行权限设置在DOtNet中,会采用FileSystemAccessRule类进行文件的权限操作. 1.现在看一下FileSystemAccessRule的实现代码: public FileSystemAccessRule( IdentityReference identi

  • C#枚举中的位运算权限分配浅谈

    常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第一步, 先建立一个枚举表示所有的权限管理操作: 复制代码 代码如下: [Flags] public enum Permissions { Insert = 1, Delete = 2, Update = 4, Query = 8 } [Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的

  • c#通过进程调用cmd判断登录用户权限代码分享

    复制代码 代码如下: /// <summary>/// 应用程序的主入口点./// </summary>[STAThread]static void Main(){ if (RunCmd("net localgroup administrators").IndexOf(System.Environment.UserName) >= 0)    { //顺利执行.    }    else    {        //报错提示系统不是管理员用户登录,容易导致

  • c# 解决IIS写Excel的权限问题

    具体配置方法如下: 1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击

  • C#权限管理和设计浅谈

    此文主要想和大家分享的是这段时间,对权限管理和设计的断断续续的思考学习,和个人的一些软件开发等方面的看法. 提到'权限管理和设计',大家可能会第一时间想到这园子里的 吉日嘎拉,在这方面他可以算是'大牛'或专家 --他的'通用权限管理系统',究竟做的怎样,看看他的博客就差不多可以知道了(貌似我在给他做推广,呵呵...,but in fact,is not),别的暂且不敢说,最起码可以看出他研究的比较深入和狂热,其系统也具有一定的'成熟度',用他的话来说--就是在努力做到他的极致.他做的是通用权限管

  • 浅谈vue权限管理实现及流程

    一.整体思路 后端返回用户权限,前端根据用户权限处理得到左侧菜单:所有路由在前端定义好,根据后端返回的用户权限筛选出需要挂载的路由,然后使用 addRoutes 动态挂载路由. 二.实现要点 (1)路由定义,分为初始路由和动态路由,一般来说初始路由只有 login,其他路由都挂载在 home 路由之下需要动态挂载. (2)用户登录,登录成功之后得到 token,保存在 sessionStorage,跳转到 home,此时会进入路由拦截根据 token 获取用户权限列表. (3)全局路由拦截,根据

  • 浅谈python对象数据的读写权限

    面向对象的编程语言在写大型程序的的时候,往往比面向过程的语言用起来更方便,安全.其中原因之一在于:类机制. 类,对众多的数据进行分类,封装,让一个数据对象成为一个完整的个体,贴近现实生活,高度抽象化.但是,python对类的封装并不好,因为所有的属性和方法都是公开的,你可以随意访问或者写入,你可以在类的外部对类的属性进行修改,甚至添加属性.这的确让人感到不安. 下面就来总结一下学习后的解决方案. 1,使用2个下划线前缀隐藏属性或者方法. __xxx #!/usr/bin/python3 #-*-

  • 浅谈SQL Server 对于内存的管理[图文]

    理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) 对于计算机来说,存储体系是分层级的.离CPU越近的地方速度愉快,但容量越小(如图1所示).比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘.但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级.比如硬盘通常要比同时代的内存大一个数量级. 图1

  • 浅谈Oracle数据库的建模与设计

    正在看的ORACLE教程是:浅谈Oracle数据库的建模与设计.要开发一个基于数据库的应用系统,其中最关键的一步就是整个系统所依据的数据库的建模设计,从逻辑的到物理的,一个环节疏于设计,整个的应用系统便似建立在危房之上,随着开发过程的不断深入,它要随时面临着各种难 以预料的风险,开发者要为修改或重新设计没有设计好的数据库系统而付出难以预料的代价.所以,一个良好的数据库设计是高效率的系统所必须的. 一.逻辑建模 数据库设计的方法因具体数据库而异,但是建模阶段的相同的,所以可以用一些通用的工具来进行

  • 浅谈Tomcat多层容器的设计

    目录 容器的层次结构 请求定位Servlet的过程 工作原理 Tomcat的容器用来装载Servlet.那Tomcat的Servlet容器是如何设计的呢? 容器的层次结构 Tomcat设计了4种容器:Engine.Host.Context和Wrapper Tomcat通过这种分层,使得Servlet容器具有很好的灵活性. Context表示一个Web应用程序 Wrapper表示一个Servlet,一个Web应用程序中可能会有多个Servlet Host代表一个虚拟主机,或一个站点,可以给Tomc

  • 浅谈Java并发之同步器设计

    前言: 在 Java并发内存模型详情了解到多进程(线程)读取共享资源的时候存在竞争条件. 计算机中通过设计同步器来协调进程(线程)之间执行顺序.同步器作用就像登机安检人员一样可以协调旅客按顺序通过. 在Java中,同步器可以理解为一个对象,它根据自身状态协调线程的执行顺序.比如锁(Lock),信号量(Semaphore),屏障(CyclicBarrier),阻塞队列(Blocking Queue). 这些同步器在功能设计上有所不同,但是内部实现上有共通的地方. 1.同步器 同步器的设计一般包含几

  • 浅谈java中OO的概念和设计原则(必看)

    一.OO(面向对象)的设计基础 面向对象(OO):就是基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供灵活性,来认识.理解.刻划客观世界和设计.构建相应的软件系统.面向对象的特征:虽然各种面向对象编程语言相互有别,但都能看到它们对面向对象基本特征的支持, 即 "抽象.封装.继承.多态" : – 抽象,先不考虑细节 – 封装,隐藏内部实现 – 继承,复用现有代码 – 多态,改写对象行为 面向对象设计模式:是"好的面向对象设计",所谓"

  • 浅谈C#六大设计原则

    笔者作为一个菜鸟,会尝试以简单的代码和容易理解的语句去解释这几种原则的特性和应用场景. 这六种原则分别为单一职责原则.接口隔离原则.里氏替换原则.迪米特法则.依赖倒置原则.开闭原则. 单一职责原则 单一职责原则(SRP:Single responsibility principle),规定一个类中应该只有一个原因引起类的变化. 单一职责原则的核心就是解耦和增强内聚性. 问题: // 假设此类是数据库上下文 public class DatabaseContext { } public class

  • 浅谈Java springboot日志管理

    一.前言 springboot默认使用Logback组件作为日志管理.Logback是由log4j创始人设计的一个开源日志组件. 在springboot项目中我们不需要额外的添加Logback的依赖,因为在spring-boot-starter或者spring-boot-starter-web中已经包含了Logback的依赖 Logback读取配置文件的步骤 在classpath下查找文件logback-test.xml 如果文件不存在,则查找logback.xml 如果上面两个文件都不存在,L

随机推荐