Community Server专题十:MemberRole之RoleMana

系统 1709 0
 

Community Server 专题十: MemberRole RoleManager

由于最近忙于一些琐事,近半个月都没有写新的专题,今天忙里抽闲赶紧补上,实在是抱歉。

 

设计做多了就会发现,用户权限管理是一个永恒的话题,几乎没有什么项目不需要权限和角色管理的,可能会无数次去写角色管理的代码,而且会根据项目的不同粒度也会有所不同。在 CS 中,采用了 MemberRole.dll 中的 RoleManager 进行角色管理,该角色管理机制同样在 asp.net 2.0 beta2 中得到应用。在分析代码之前先看看数据库中的角色的关系表: Community Server专题十:MemberRole之RoleManager

表分两种前缀,一种是“ aspnet_ ”另一种是“ cs_ ”,“ aspnet_ ”是采用 MemberRole.dll 组件所必需的一些表,包括过程和视图等都是这样命名的,在 asp.net 2.0 beta2 中你也可以看到同样的表、视图与储存过程。“ cs_ ”前缀是 CS 系统需要的表,由此可以看到 MemberRole.dll 中的 RoleManager 只管理到角色级别,通常我们还会给角色添加一些权限,然后在应用系统中判断角色拥有的权限从而决定用户是否有访问的权限,当然一个用户可以有多个角色,一个角色又可以有多个权限。有时你设计的某些系统是不需要做如此多权限管理的,只要多个角色就可以解决问题,那么就不再需要扩展数据库,直接使用 MemberRole.dll 中的 RoleManager 就可以了。

注意:你可能会对 cs_SectionPermissions cs_ProductPermissions 表产生疑惑,这里有两个权限表,分别管理两种权限, cs_SectionPermissions 中存储节点级别的权限,如 Blog 中,是否有权限开通 blog ,管理所有 blog 等,这些权限就放在 cs_SectionPermissions ,但是对于每个 blog ,如我的 blog ,现在不想要某个用户访问,或者需要某个用户帮忙管理,再或者某个地方某些用户可以访问,某些不行,这样的权限就放入 cs_ProductPermissions 中设置。

RoleManager 是一个 HttpModule ,由此可以在 web.config 中看到如下的配置文件:

 

< add  name ="RoleManager"  type ="Microsoft.ScalableHosting.Security.RoleManagerModule, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562"   />

 

这也是 RoleManager 角色管理的入口点,同时,在 RoleManager 中实现了 IConfigurationSectionHandler 接口,用来读取 Web.config 中的以下配置:

        

< roleManager 

              
cacheRolesInCookie ="true"  cookieName =".CSRoles"  cookieTimeout ="90"

              cookiePath
="/"   cookieRequireSSL ="false"  cookieSlidingExpiration ="true"  

              createPersistentCookie
="true"  cookieProtection ="All"  maxCachedResults ="1000"   >

              
< providers >

                   
< add

                       
name ="CommunityServerSqlProvider"

                       type
="CommunityServer.Components.CSRoleProvider, CommunityServer.Components"

                       connectionStringName
="SiteSqlServer"

                       applicationName
="dev"

                       description
="Stores and retrieves roles data from the local Microsoft SQL Server database"  

                   
/>

              
</ providers >

     
</ roleManager >      

再这里我们又看到了 Provider 模型,其实 asp.net 2.0 beta2 中大量使用了这种数据访问模型。它的优点我在前面的专题中已经讲解过,不理解的朋友可以看我之前的专题。

RoleManager 很重要的一个类就是:

Community Server专题十:MemberRole之RoleManager 该类继承至 IPrincipal ,因此我们可以在用户登录后通过检查当前 Context User 的一些方法和属性,判断拥护是否拥有某角色。操作的方法在 RoleMangerModule 类下的 OnEnter 下:

OnEnter方法

由于知识点比较简单, MSDN 上也有相关的 IPrincipal Identity 的介绍,我就不细细的分析。

RoleManger 里,很多地方使用了 Cookie ,这样做提高了不少的效率,你想,如果每个用户每次访问一个页面都去读一次数据库,把该访问用户的权限读取出来,也许你聪明点,把该用户的权限先缓存在内存中,并且设置一定的过期时间,其实你还能再聪明一点,那就是把角色保存在客户端的 Cookie ,这样连服务器的内存都节约了。只有在用户第一次登录,或者清除了 Cookie Cookie 失效的情况下才需要访问数据库。但是这也带来一个问题,就是如果客户端禁止使用 Cookie ,用户将无法正常访问。 CS 中通过在 web.config 中可以配置是否启用这种机制。

 

到这里,整个 MemberRole.dll 算是粗略的讲解了一遍,由于时间上的限制不可能满足所有读者的要求,如果有疑问可以 msn 我或者给我留言。后面一些专题我将说说 CS 的页面,包括 MasterPage Theme Skin 等机制。

Community Server专题十:MemberRole之RoleManager


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论