65.9K
CodeProject 正在变化。 阅读更多。
Home

在对象级别创建自定义权限

2012 年 6 月 11 日

CPOL

3分钟阅读

viewsIcon

59117

downloadIcon

3840

在对象级别创建自定义权限,无需登录和注销即可影响用户

下载 CustomPermission.zip

引言

这是一个对象级别的自定义权限控制,可以控制用户对页面中对象的访问权限!
在这个项目中,我使用了 Linq to EntityFramework。

您只需要将权限添加到角色,并将角色添加到用户,

然后在您的页面中只需使用此类,这是一个代码示例,说明它是如何工作的

     btn1.Visible = PermissionControl.CheckPermission("Install");
     btn2.Visible = PermissionControl.CheckPermission("UnInstall");
       

自定义权限表

在自定义权限数据库中,我们有5个表:

1-Users:存储用户信息。

2-Roles:存储角色。

3-Permission:存储权限,并有两个权限名称:第一个是权限标题,用于向用户显示,第二个是常量名称,用于编码中,如预览代码片段。

4-Users Roles:存储用户的角色,因为每个用户可以有多个角色。

5-Role Permissions:存储每个角色的权限。

使用代码

在本章中,我将解释它的工作原理:

首先,您创建这两个集合的实例

private static readonly HttpSessionState Session = HttpContext.Current.Session;
private static readonly HttpApplicationState Application = HttpContext.Current.Application;

会话(Session)用于每个用户,应用程序(application)用于所有当前用户。
我们继续前进,您将理解此代码段的原因。

然后您创建一个名为 CheckPermission 的方法,您只需要将
权限的PermissionConstantName传递给此方法

public static bool CheckPermission(string PermissionConstantName)
{ 
    bool result = false; 
    // Is current visitor logged in?
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    { 
        return false;
    } 
    string Username = HttpContext.Current.User.Identity.Name; 
    //if in user permissions you make changes, you have to clear his permission list
    if (Application["AffectedUsers"] != null)
    { 
        var AffectedUsers = (List<string>) Application["AffectedUsers"];
        if (AffectedUsers.Contains(Username))
        {
            Session["PermissionList"] = null;
            AffectedUsers.Remove(Username);
            Application["AffectedUsers"] = AffectedUsers;
        } 
    } 
    Users CurrentUser = 
        (from user in DataContext.Context.Users where user.Username == Username select user).
            SingleOrDefault(); 
    //return True because SuperAdmin has all the permissions!
    if (CurrentUser.IsSuperAdmin)
    { 
        return true;
    } 
    if (Session["PermissionList"] == null)
    {
        List<string> PermissionList = (from p in DataContext.Context.Permissions
                                       join rp in DataContext.Context.RolePermissions on 
                                       p.PermissionID
                                           equals
                                           rp.PermissionID
                                       join r in DataContext.Context.Roles on rp.RoleID 
                                       equals r.RoleID
                                       join ur in DataContext.Context.UserRoles on r.RoleID 
                                           ur.RoleID
                                       where ur.UserID == CurrentUser.UserID
                                       select p.PermissionConstantName).Distinct().ToList(); 
        Session["PermissionList"] = PermissionList; 
        result = PermissionList.Contains(PermissionConstantName);
    } 
    else 
    { 
        var PermissionList = (List<string>) Session["PermissionList"]; 
        result = PermissionList.Contains(PermissionConstantName); 
    } 
    return result; 
} 


当您在代码中调用此方法时,该方法使用HttpContext查找当前用户,并检查该用户是否具有权限。

当前用户的权限收集在会话(session)中的列表中。

而受影响的用户列表用于

当您更改角色权限时,意味着当前用户不再有权访问该对象,并且如果用户存在于该列表中,则检查权限将返回 false。
这是我的自定义权限控制的优点,不需要注销并重新登录
再次影响当前用户。

如果用户是超级管理员,则意味着有权访问所有对象,不需要与数据库中的权限表进行检查,因此该方法为超级管理员返回 true。

管理角色权限

您只需要一个 GridView 控件来显示角色,以及一个复选框列表来显示权限。

我在这里不写代码,因为我将其包含在下载的项目中,并且足够清楚易懂。

管理用户

您需要一个网格视图来显示用户详细信息,一些文本框,以及一些复选框来显示现有角色,并添加角色到用户。
我已经为您完成了,包含在我的项目中。

我如何在我的当前项目中使用它?

我的用户表不够好,因为我只关注权限,您可以改进我的用户表并在您的项目中使用它,您只需要使用这个类并调用CheckPermission并传递一个字符串给这个方法。

以这种方式使用此类

<asp:LinkButton ID="lbConfigure" runat="server" CommandName="Configure" CommandArgument='<%# Eval("AdminFilePath") %>' Visible='<%#PortalCommon.PermissionControl.CheckPermission("ModuleConfig") %>'>Install module</asp:LinkButton>    

或者在代码隐藏中

            btn1.Visible = PermissionControl.CheckPermission("Install");
            LinkButton1.Visible = PermissionControl.CheckPermission("UnInstall"); 

如果您想测试我的项目,请更改连接字符串并在 Model 文件夹中打开 cp.edmx,右键单击表之间的空白区域并选择 Generate database from model,并在数据库中执行该脚本,添加具有 constname: InstallUnIstallpermission 到数据库,然后使用 PermissionManager page 创建新角色,然后使用角色创建用户并使用登录表单,然后转到 default.aspx 页面并查看角色如何影响页面上的对象!

我将包含一个数据库文件夹,供不熟悉 Entity FrameWork 的人使用。

© . All rights reserved.