Magicshui's Blog

Magicshui on Programming && Life

角色–动作类通用权限系统的设计

这两天遇到了一个项目中的问题就是为系统设计一个通用的权限系统,要求如下:

1 页面上的链接、按钮等只对具有权限的人开发

2 使用基于角色的权限设置

其实很简单,因为要求少,但是因为对方不知道其业务需求的变化情况,因此需要留有变动的余地。

就这个问题,我写了一套比较简单的通用权限系统,使用说明如下:

权限动作

Auth文件夹下的auth.xml为权限系统的定义文件,其中cat为权限的类别,而其中的子元素item为动作权限名称以及值。
例如:


    
    
    
    
  

代表角色管理的四个权限

页面显示

为了不修改原有系统的逻辑以及构架,页面显示采用在原有的元素中添加rule的方式进行权限控制。
例如:

角色管理

其中,rule是对元素显示要求的权限,具备rule中以|分隔开的任意一个值即可满足条件。
注意,为了使得权限系统对于最高管理员生效,请大家在rule中首先添加Admin,方便测试

后台代码

为了防止用户强制注入,后台代码采用权限管理的函数进行控制。其中,使用Auth.Auth.V(“权限名”)来写入期望的权限,而Admin为最高权限,请大家在权限命中首先添加,添加以|分割开的多个权限名代表满足任意一个即可。
例如:

protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                Auth.Auth.V("Admin|User_Role_Add");
            }
        }

代表用户如果具备Admin或是UserRoleAdd权限之一即可正常执行,否则跳转到无权限页面。

项目已经作为开源方式添加到了codeplex上,因为是第一次设计这样的复用性权限系统,所以可以改进的地方还有很多~

地址:http://aole51.codeplex.com

编程,一路走来

懵懂的编程历史是从高中开始,第一门编程语言是Basic,第一台变成机器是文曲星。05年进入了高中,和小左童鞋同桌的时候发现他总是捣鼓着文曲星,看看知道这就是在写程序,于是就让他教我写程序,但是简单的Basic程序,虽然计算机课也上,但是当时还是特别简单的计算机基础知识,不过后来就教了关于VBScript的东西~

高中编写程序的日子还是很幼稚的,主要是写几十行的代码,没有复杂的逻辑,小左的爱好是写各种特效,后来就直接写一个小的RPG游戏了。可惜我这人不够聪颖,于是代码始终停留在低级水平。一度认为Basic是牛B的语言,后来发现还有更多高级的东西,但是毕竟是高中生,时间、精力有限,加上老班总会盯梢,Basic也没多久就不再写了~现在回到家还会看到当时的文曲星,但是程序已经删除殆尽了,可惜了~

有段时间,学校组织信息竞赛,也就是编程,没有报名,因为觉得自己还差太多,看到班里的童鞋学着数据结构、算法、Fortran很是羡慕,即使是现在也会后悔当时没有试一试~

大学了以后不认为会能够在计算机方面有建树,因为我们是文科学院,虽然都是一群呆呆的理科生,但是环境造人,于是开始混学生会,知道大二了才醒悟,发现原来我们专业还是需要技术作为敲门砖,便在大二前的那个暑假留在了学校,自己学习C#。其实,大一下已经开始学c了,但是觉得指针这东西很麻烦,动不动就出错,就没有坚持学习下去,一个直接后果就是后来的数据结构没有学好。

c#是大学里用的做多的语言,也是比较喜欢的语言。其实,我觉得相比于语言,可能是更喜欢IDE,因为太白痴了,能够让人很解放~

Basic大学里有因为专业的原因学起来了,感觉有些熟悉但又陌生,毕竟高中的时候已经习惯了那种简单的程序。还好,作业是一个计算器很成功的完成了,以后就再也没有接触过,除了帮同学复习过计算机二级的考试之外。

其实,使用c#主要是因为能够通过拖放做出可以运行的桌面程序,让人很有成就感,不过,因为写的很简单,甚至幼稚,成长很少,这个时期开始更多的关注互联网,成为了谷歌的粉丝,更成为一个博客人,呜哈哈,以前的文章很装的写各种how-to,现在想想算是学习的积累吧。发现,大家更多的关注与Web的编程,了解到了Django这样的框架,想要学习Python这门语言,不过同期,师兄成立了团队,便尝试学习Web端的编程,虽然假期在郑州学习CCNA,时间挺紧,不过还是通过小聪明做出了自己的第一个完整的Web程序—–一个简单的导航网站,呜哈哈,其实很鸡肋的,但是成就感不低。同期,每天来往的班车上开始看JAVA,那本大厚本看了一大半,到了最后实在是不想看了就作罢,最后得到的结论是java不如C#

对于语言的关注是一个方面,更多的开始想到了构架,因为一个同样的问题,别人写出来就很优美,自己总是在CRUD,就更多的关注别人的博客,尤其是一些大牛的,知道了设计模式的存在、知道了IoC等等,但是,因为还是有限的能力没有在具体的项目中实施~

大三上是在团队中学习的时期,主要是熟悉C# WebForm,后来发现诸多弊端,但介于时间、精力,最后在寒假的时候才真正的看完了MVC的教程,并且写了一个切实的项目~

现在又是一个新的学期,目标放在python上、linux上,希望利用这些技术来完成毕业设计的技术实现部分,不过貌似还有点早,技术上的储备明显不够,而且Ubuntu的界面实在不优美,受不了呀~受不了~

基于Orchard创建博客系统

Orchard是微软这两年的一个项目,现在正式对外公开,部署在codeplex,从官方的页面可以看到Orchardhowling_wolf的运行环境是.NET 4.0,并且其构架中以微软的技术为主,而一些开放的软件业同样被纳入项目中,例如NHibernate作为ORM工具而不是自家的EF,想想可能是现在EF不成熟,以后的变动将会比较大的缘故,还有就是没有使用Unity而是采用的Autofac作为IoC容器,想来应该也是不成熟的缘故。不过,微软的这个项目毕竟是本着为行业做个典范的目的,所以就效果来看已经不错了。

比较欣赏Orchard的构架,但是这么庞大的代码对我来说还是有些不好消化,因此,就有了简化Orchard的念头,有以下的几点作为构架基础:

1 使用MVC作为整体框架基础

2 使用Autofac做Ioc框架

3 使用EF4CTP中CodeFirst作为ORM的工具

4 使用Log4net作为Logging工具

在此之上,构建Framework分别处理如下方面的内容:

1 数据库

2 安全

3 路由注册

4 Log

5 模块加载与调用

Framework是这个系统的基础,其他的模块应该直接调用,而不应该再自定义类型。然后就是系统具有构架在Framework之上的Core部分,这个部分包含能够让系统运行的最小模块集合,包含的功能如:

1 初始化系统

2 加载系统中的模块

3 初始化模块

4 具有模块的管理界面

最后一部分就是模块的制作,这里参考Orchard希望模块应当具有如下的组织结构:

+ Controller

—– AdminController.cs

+ View

—– + Admin

———+ Index.cshtml

+ Model

+ Content

+ MenuInject.cs

+ DatabaseGenerate.cs

+ Module.txt

其中Module中定义了加载模块的信息,DatabaseGenerate.cs用来初始化模块以后创建相应的数据库表等,Controller中的AdminController是必须的,用来提供统一的后台管理接口,MenuInject.cs用来加载选项到后台管理页面。

最后,因为从简的需要,整个Module的组织是依据Areas的结构创建的,同时,也是有Area来提供各种支持。但是,因为Area的逻辑在一定程度上和现在的需要有差异,因此还要对原来的AreaRegistration做出修改,实现动态的热插拔。

这就是对我这个学期的20%项目的简介,主要是实现类似于Wordpress功能的博客系统,而功能的增加将会使用Module的方式按照接口运行第三方来创建。