上一篇介绍的是某个类型,如User,Role这样,相当于C#中的Class的权限控制,现在这篇讲的是,某个特定的实例,如 var a=new User() 中的 a。 现在以Ornament.Message.Info 为例,无需要对某种类型Info作出权限控制,例如现在有3中InfoType,如System系统的信息,Account关于账号本身的,User关于每个User本身的操作。

 

  1. 定义操作

  2. 定义资源信息

  3. 制作许可证界面

  4. 生成许可证

  5. 派发许可证给角色

 

参考源码中的这几个项目。

image

定义操作

[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

 
posted @ 2011-09-09 16:38 沉默的糕点 阅读(26) 评论(4) 编辑

 

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>
posted @ 2011-09-09 16:38 沉默的糕点 阅读(7) 评论(0) 编辑