<!--[if !supportLists]-->1. <!--[endif]-->统一winform,webform下的权限控制方式。过去在asp.net的权限控制中多数采用对页面或者URL进行权限验证,Godtear.Security基于CAS实现对类及方法进行权限验证,使asp.net中同一页面的不同操作授予不同的权限管制。Godtear.Security采用权限申明标签(Attribute)对winform,webform中的方法或类进行权限管制申明。对于C/S,B/S混合架构的项目中,为权限控制提供了一致的方式。
<!--[if !supportLists]-->2. <!--[endif]-->过往对系统的权限控制大多数在View(视图)层或者UI上,Godtear.Security可以在包括BLL,DAL,甚至对WebService进行权限验证,所以在基于SOA架构的系统中,可以很好地在服务端进行访问权限的管制。
<!--[if !supportLists]-->3. <!--[endif]-->“关注分离”是系统良好设计的原则之一,过去在系统中对业务逻辑和权限控制的分离通常采用AOP拦截或者定义一个预先进行权限验证的页面或窗体基类。Godtear.Security采用权限申明标签(Attribute)来标记方法或类,标记执行方法或者调用类型所需要的权限。这样,在系统设计和开发的前一阶段,程序员不需要考虑任何权限控制的问题而专心于业务模型和业务逻辑。当系统在无权限管制的状态下达到所有的功能和非功能性测试后,再在所需权限管制的地方添加权限申明标签就可以实现灵活的权限控制,这对于降低系统设计和开发的复杂度,工作量很有价值。
<!--[if !supportLists]-->4. <!--[endif]-->为了给系统设计者更大的灵活性,Godtear.Security只涉及到系统中相关的权限设计,而不涉及到用户或者角色管理,所以在Godtear.Security中不提供对用户和角色的CRUD等实现,也没有确定的安全性数据库结构约束。
二,Godtear.Security的权限控制设计
<!--[if !supportLists]-->1. <!--[endif]-->依然基于角色的概念来实现权限的控制,只能给用户制定多个角色而不能给用户直接指派操作权限。
<!--[if !supportLists]-->2. <!--[endif]-->角色分为TreeRole(从属角色),TeamRole(团队角色),TreeRole是可以继承的角色,一个TreeRole的角色权限是其自身权限跟父角色的权限并集。TeamRole是不能继承的角色。一个用户可以指派多个TeamRole和一个TreeRole,一个用户所具有的权限是其所具有的角色(包括TreeRole,TeamRole)的权限的并集。系统中只能指派权限进行叠加,而不能指定拒绝的权限。
<!--[if !supportLists]-->3. <!--[endif]-->权限是指对某个权限资源进行某种操作的权力。系统设计这可以灵活地定义权限资源和所有的权限操作。例如,把系统中所有的权限资源定义为:邮件,音乐和文件。把权限操作定义为:读,写,删除,执行,审批。那么读邮件,播放音乐,删除文件等都是一种权限。对同一权限资源的多种操作可以叠加为一个权限。
<!--[if !supportLists]-->4. <!--[endif]-->被添加权限申明标签的一个类或者一个方法叫做一个权限控制点,一个权限控制点对应一个权限资源,一个权限资源可以对应多个权限控制点。语义上可能有几个不同的方法是需要权限管制的,而这几个方法是共同完成相关功能的,那么这几个方法应该对应同一个权限资源。所以,合理地规划权限控制点和权限资源需要根据项目的具体情况来决定。
三,Godtear.Security的权限控制实现
<!--[if !supportLists]-->1. <!--[endif]-->IGTIdentity用户接口
public interface IGTIdentity : IIdentity,IXmlParser
}
IGTIdentity是系统帐户的抽象接口,系统设计者在定义帐户或用户时应该实现该接口。
<!--[if !supportLists]-->2. <!--[endif]-->IGTPrincipal身份凭证接口
public interface IGTPrincipal : IPrincipal
}
IGTPrincipal是系统中身份凭证的接口,附带帐户信息和权限信息以便CLR在运行时进行验证。Godtear.Seciruty中缺省的GTPrincipal实现,除非必要,系统设计者不需要另外定义实现。
<!--[if !supportLists]-->3. <!--[endif]-->IAccessCode接口
public interface IAccessCode : ICopy<IAccessCode>
}
IAccessCode表示一个权限操作,权限操作以操作值来区别。
<!--[if !supportLists]-->4. <!--[endif]-->IDroit接口
}
IDroit接口表示一个权限,Guid表示了权限资源,AccessCodes表示对Guid权限资源能进行的权限操作集。
<!--[if !supportLists]-->5. <!--[endif]-->ISecurityRole接口
public interface ISecurityRole : IName
}
ISecurityRole借口表示一个角色,TreeRole,TeamRole类表示对从属角色和团队角色的实现。
<!--[if !supportLists]-->6. <!--[endif]-->GTCodePermission类
}
GTCodePermission是核心类,它没有象前一篇文章所列具的代码访问权限实现那样继承于CodeAccessPermission,而是直接实现IPermission和IUnrestrictedPermission接口,因为在Godtear.Security中所需要的是CAS的权限验证(Demand),而无须Deny,PermitOny等。另外在验证权限失败时候也没有抛出系统的SecurityException,而是抛出自定义的GTPermissionException异常。
<!--[if !supportLists]-->7. <!--[endif]-->CodeAccessBaseAttribute抽象基类
}
CodeAccessBaseAttribute类是是所有权限申明标签的基类,系统设计者可以根据自己对权限资源和权限操作的定义,简单地继承该类就实现自己的权限申明标签,Godtear.Security的Samples项目中有相关的示范。
<!--[if !supportLists]-->8. <!--[endif]-->Authentication和WebAuthentication类
}
Authentication和WebAuthentication类是帮助用户进行登录和登出的类,分别在Winform和Webform项目中。示范可以参考Godtear.Security的Samples项目。
<!--[if !supportLists]-->9. <!--[endif]-->IIdentityProvider 和IRoleProvider接口
IIdentityProvider 和IRoleProvider接口是系统中身份获取和角色权限获取的提供接口, Godtear.Security不关心自定义帐户及权限数据库, 系统设计者可以灵活地自定义,系统设计者只需要实现这两个接口,然后在Godtear.config中的Security配置块中配置自定义实现。示范可以参考Godtear.Security的Samples项目。
四,Godtear.Security的权限控制示范
Godtear.Security附带了Samples项目,Samples项目不是以框架设计者的角度,而是以应用系统设计者的角度来使用Godtear.Security的。
<!--[if !supportLists]-->1. <!--[endif]-->Samples.BusinessModel
Samples中的Samples.BusinessModel项目中定义了实体对象User,权限申明标签SampleCodeAccessAttribute,及应用系统中的权限资源PermissionResource枚举和权限操作RightType枚举。
}
<!--[if !supportLists]-->2. <!--[endif]-->Samples.DataProvider
Samples.DataProvider项目定义了IIdentityProvider,IRoleProvider,IEncrption的实现。
}
由于帐户和角色的持久化结构是由用户定义的,所以Samples中没有给出相应的实现,而只是测试性的数据。应用系统设计者可以自定数据库结构和访问,xml架构和读写,甚至调用WebService来获取帐户和角色信息。对于数据库设计者来说,一个概念性的结构可能是这样的: <!--[if !vml]--><!--[endif]-->
![]()
<!--[if !supportLists]-->3. <!--[endif]-->Samples.Security
Samples.Security是Demo的Winform主程序,Godtear.config配置文件如下:
<godTear>
<dataAccess>
</dataAccess>
<providers>
</providers>
<security>
<encryptionProvider type="Samples.DataProvider.AuthenticationEncryption,Samples.DataProvider" />
<identityProvider type="Samples.DataProvider.IdentityProvider,Samples.DataProvider" />
<roleProvider type="Samples.DataProvider.RoleProvider,Samples.DataProvider" />
</security>
</godTear>
项目中对权限控制方式如下:
}
以上代码的语义是:执行Dosomething2方法需要具有对Download资源的Read,Write和Delete的权限,否则拒绝执行并抛出异常。执行Dosomething3方法需要具有对Download资源的Read和Execute的权限,否则拒绝执行并抛出异常。Dosomething2与Dosomething3属于两个不同的权限控制点,但却归属同一个权限资源Download,此种情况一般是因为Dosomething2与Dosomething3进行了相关的功能操作。
new Authentication("lyg", "lyg").SignIn();
new Authentication().SignOut();
分别是在winform中进行帐户的登录和登出操作。
<!--[if !supportLists]-->4. <!--[endif]-->Site"SecurityBlock.aspx
SecurityBlock.aspx是Webform的Demo页面,需要在Web.config中添加HttpModule
<httpModules>
<add name ="AuthenticationModule" type ="LYG.GodTear.Security.Authentication.AuthenticationModule,LYG.Godtear.Security"/>
</httpModules>
new WebAuthentication("lyg", "lyg").SignIn();
new WebAuthentication().SignOut();
分别是在webform中进行帐户的登录和登出操作。
总结:
Godtear.Security是Godtear开源工程的一部分,其基于CAS的权限控制相对比较灵活,方便和更深度的管制,由于比较匆忙所以不尽完善,Godtear的其他Block将在后续发布。源代码可以到Godtear工程的项目主页是godtear.codeplex.com下载。