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






4.94/5 (12投票s)
在对象级别创建自定义权限,无需登录和注销即可影响用户
下载 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: Install 和 UnIstall 的 permission 到数据库,然后使用 PermissionManager page 创建新角色,然后使用角色创建用户并使用登录表单,然后转到 default.aspx 页面并查看角色如何影响页面上的对象!
我将包含一个数据库文件夹,供不熟悉 Entity FrameWork 的人使用。