您的位置:首页 > 其它

构建基于角色、由应用程序管理的授权框架

2006-08-16 09:01 405 查看
安全性是一个非常大的课题,本篇文章旨在探讨授权部分。
如果你不理解安全性相关概念,可以参考如下几篇文章:
1、Web 应用程序安全框架:http://erpcrm.cnblogs.com/articles/234776.html
2、设计由应用程序管理的授权:http://erpcrm.cnblogs.com/articles/234793.html
3 、.net 基于角色的安全性介绍 http://msdn.microsoft.com/library/chs/?url=/library/CHS/cpguide/html/cpconIntroductionToRole-BasedSecurity.asp

本文假设你对.net 安全性相关概念如Principal 和Identity有所了解。
一、分析
先看一个基于角色授权的需求:
在一个CRM系统中,用户 “zhangsan”属于销售部的一名普通员工,“lisi”是该销售部的部门经理,“zhangsan”作为一名销售员有创建新客户的权利(customer.add),删除客户的权利(customer.delete)只有部门经理才有。
这种需求,我们一般情况下,建立两个角色(employees,managers),zhangsan属于employees, lisi属于managers,
然后我们再定义employees有customer.add的权利,managers两个权利都有,这样就基本满足了这种需求。

现在有一个更深层次的需求:zhangsan作为销售员需要报销一些行销费用,在报销流程中,1000元以下的费用由部门经理审批,超过1000元的由总经理审批,类似这样的需求,我们认为属于业务逻辑范畴,本授权框架不解决类似问题。

本框架的数据持久部分如下图:
本持久部分是该授权框架的一个持久实现,本框架数据持久部分采用porvider模型,允许你定义自己的持久实现。
using System;
using System.Runtime.Serialization;
using System.Configuration;

namespace ECube.Business.Security

上面这个是ECubeIdentity的源码,比较简单,没啥可说的。
下面看看ECubePrinicpal:

using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Security.Principal;
using System.Web.Security;
using ECube.Business.SystemFramework;
using ECube.Business.Security.Data;

namespace ECube.Business.Security

如果你只是想使用本框架的话,你接触到的只会是ECubePrincipal类。如果你想实现自己的持久,你可以实现
IRoleProvider、IUserProvider、IPerssionsProvider接口,当然了还需要一些配置(不过我会实现一个工具来完成这个过程)
如何使用本框架进行登录验证呢?
场景一:
考虑一个非ASP.NET 环境,你在登录窗口的登录按钮的CLICK 事件中,可以这样写:
{
if( ECubePrincipal.Login(usernmae,userpwd,true))
{
....
}
}
就这么简单。
场景二:
ASp.net环境,asp.net 中可能稍微复杂一些,因为asp.net 有自己的验证机制,但也不是没办法。
我们可以在Global.asax的方

法中写如下代码(当然你可以自己实现一个IhttpModule,不一定非得在Global.asax中)

void Applicaiton_AuthenticateRequest(object sender, EventArgs e)

从上面这两个场景可以看到:使用ECubePrincipal进行登录验证有2种方法
一是利用Login。,二是直接new ECubePrincipal 。

三、如何进行授权

验证授权验证非常简单:
class Customer
{
void Add()
{
ECubePrincipal princ = System.Threading.Thread.CurrentPrincipal as ECube.Business.Security.ECubePrincipal
if(princ != null && princ.CheckPermission("customer.add"))
{

}
}
}
如果你在ASP.NET页面中,你还可以这样写:
ECubePrincipal princ = Page.User as ECube.Business.Security.ECubePrincipal
if(princ != null && princ.CheckPermission("customer.add"))
{
.
}

四、结束语
本框架构建在.net 2.0平台上,适用于asp.net和非asp.net环境中。
在该文章中,没有介绍的类,如IUserProivder, BizApplication(读写配置文件的类),以及实现持久化的类 ,你可以参考我的源码(其实该提供一个类图,但我的VISIO反相不了,有谁知道VISIO反相vss2005的插件,麻烦告诉我一声)。
地址为:http://files.cnblogs.com/erpcrm/ECubeSecurity.rar
该源码可能无法编译通过(因为我刚改动了数据库结构),本文属于<<利用asp.net 2.0构建企业级门户平台>> 系列文章的一部分,将来的代码你可以参考这个系列文章中的源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐