AspNetForums中对于用户权限,是类似于Windows系统采用基于角色(Role)的权限控制,这样,我们就可以根据需要,设定不同的角色,设置各个角色的权限,并将各个用户属于不同的角色。根据用户所属的角色,来判断用户可以有哪些权限,进行哪些操作。
先看看数据库设计:
forums_Users表,用户表,UserID为主键,唯一确定一个用户
forums_Roles表,角色表,RoleID为主键,唯一确定一个角色
forums_UsersInRoles表,用户和角色对应关系表,存储用户所在的角色
forums_ForumPermissions表,角色在某版块的权限,记录了在每个版块中各个角色可以有权限进行哪些操作
再看看是如何来判断用户操作权限的:
当用户登录后,要获取论坛所有版块的信息并缓存,在获取版块信息的同时,要获取当前用户在每个版块操作(如发表新帖、投票、附件等)的权限。操作权限有三种:"有权限"、"无权限"和"未设置",如果是未设置,那么就看这个操作的默认权限是什么。一个用户可以属于多个角色,每个角色对应的操作权限不一样,要判断这个用户有没有当前操作的权限,则遍历这个用户所属的所有角色,如果任一角色有权限,那么该用户就有该操作的权限。具体实现请参考源码:
Components\Forums.cs中的GetForums(ForumContext forumContext, int userID, bool ignorePermissions, bool cacheable)方法和Components\Provider\ForumsDataProvider.cs中PopulateForumPermissionRightFromIDataReader方法。
角色和web.config的结合:
Asp.Net有一个功能就是可以用于控制对 URL 资源的客户端访问(
可参考QuickStart上的说明)。它对于用于生成请求的 HTTP 方法(GET 或 POST)是可配置的,并且可被配置为允许或拒绝访问用户组或角色组。这个方法也被应用到AspNetForums中,例如在admin目录(管理员操作相关页面)和Moderate目录(版主操作相关页面)下都有一个web.config目录,通过web.config,可以设定其所在目录的URL客户端访问权限。
以Admin目录下的web.config中的配置为例:
<authorization>
<allow roles="Global Administrators" />
<allow roles="Site Administrators" />
<deny users="*" />
</authorization>
这个表示对于属于Global Administrators角色和Site Administrators角色授权,其他任何用户都禁止访问该目录下的页面。因为对于部分页面,希望版主也可以进行访问,那么可以增加如下配置:
<location path="ForumAdmin.aspx">
<system.web>
<authorization>
<allow roles="Global Administrators" />
<allow roles="Site Administrators" />
<allow roles="Global Moderators" />
<allow roles="Site Moderators" />
<deny users="?" />
</authorization>
</system.web>
</location>
这样,对于/Admin/ForumAdmin.aspx这个URL,属于Global Moderators或Site Moderators角色的用户也可以有权访问。
怎么设置登录用户的角色?
具体实现请参考源码:Components\Roles.cs 和文章《
如何使用 Forms 身份验证创建 GenericPrincipal 对象》
附:
CnForums源码下载
当前评分 1.4 , 共有 13 人参与
- Currently 1.384615/5 Stars.
- 1
- 2
- 3
- 4
- 5