上一篇介绍的是某个类型,如User,Role这样,相当于C#中的Class的权限控制,现在这篇讲的是,某个特定的实例,如 var a=new User() 中的 a。 现在以Ornament.Message.Info 为例,无需要对某种类型Info作出权限控制,例如现在有3中InfoType,如System系统的信息,Account关于账号本身的,User关于每个User本身的操作。
-
定义操作
-
定义资源信息
-
制作许可证界面
-
生成许可证
-
派发许可证给角色
参考源码中的这几个项目。
定义操作
[Flags]
public enum InfoOperator
{
None = 0,
Read = 1,
Add = 3,
Edit = 4 | 1,
Delete = 8 | 1 | 4,
}
操作就是由enum组成,其中Edit=4|1的意思,就是Edit 前提条件是必须有Read这个操作。这样定义好处是,在判断是否拥有Read这个操作的代码,同样也适用于只有Edit操作的User。
定义资源信息
由于使用NH作为持久层,所以扩展资源也是需要NH的配置的, 请看项目Ornament.Messages.Core InfoTypeResource.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Ornament.MemberShip.Permissions" assembly="Ornament.MemberShip.Core"> <subclass name="Ornament.MemberShip.Permissions.GenericResourceInfo`1[Ornament.Messages.InfoType,Ornament.Messages.Core]" extends="ResourceInfo" discriminator-value="Info"> <many-to-one name="ResourceKey" lazy="false" class="Ornament.Messages.InfoType,Ornament.Messages.Core" column="InfoTypeId"></many-to-one> </subclass> </hibernate-mapping>
这样就声明了一种以Ornament.Message.InfoType资源了,
把权限应用于Web项目中
制作许可证界面
生成许可证
派发许可证
使用ResourceAuthorizeAttribute进行Action验证,代码如下:
public class UserController { [ResourceAuthorize(UserOperator.Modify,"User")] public void Save(User user) { //some code. } }
UserOperator 是一个User的一个Enum,而“User”是Ornament.MemberShip.Permissions.ResourceInfo的一个实例,代表用户资源。代码的意思是,拥有UserOperaotr.Modify的User才能使用这个
Action
Message各个关键类如下图:
为User资源创建相关的Message信息。
在Ornament中,有很多关于User的系统信息,如“某某用户测试了,请求批准”,"某某用户已经修改了Email",或者"某某用户已经被锁定”,而这类信息。那么为了创建特定User的信息,我们需要做以下的操作
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Ornament.Core" namespace="Ornament.Messages"> <subclass name="Ornament.Messages.Contents.GenericContent`1[Ornament.MemberShip.User,Ornament.MemberShip.Core]" extends="IContent" discriminator-value="Reader"> <many-to-one name="Value" column="UserId" class="Ornament.MemberShip.User,Ornament.MemberShip.Core" cascade="save-update"> <meta attribute="Id of User"></meta> </many-to-one> </subclass> </hibernate-mapping>



