首页 技术 正文
技术 2022年11月6日
0 收藏 996 点赞 1,128 浏览 2433 个字

此系统能满足一般权限/菜单控制需求,不需要重复开发,达到多系统共用的目的

权限判断是基于请求路径,意味着是页面级控制,可能不符合一些要求,当然你也可以把路径细化实现

菜单为二级菜单,暂不支持多级

此系统基于CRL框架内置业务开发,CRL框架详细信息

运行环境 .Net Mvc4 默认数据库MSSQL

此权限系统主要概念

  • 系统(属于哪个系统,分平台进行权限控制)
  • 菜单(跟系统挂钩,此系统有哪些菜单)
  • 角色(有哪些角色)
  • 用户(有哪些用户,跟角色挂钩)
  • 权限(角色或用户有哪些菜单的权限)

菜单

菜单结构如下,主要属性

  • 名称
  • 路径(菜单访问路径)
  • 导航显示(是否在菜单列表显示)
  • 是否禁用

CRL通用权限控制系统

菜单子级

CRL通用权限控制系统

角色

CRL通用权限控制系统

角色权限

CRL通用权限控制系统

用户

CRL通用权限控制系统

用户权限

用户权权限继承角色权限,只会多,不会少,继承的权限不能更改

CRL通用权限控制系统

设置好这些,权限系就能正常工作了,需要进行权限控制的项目需要部署权限控制,菜单效果如下

CRL通用权限控制系统

布署权限控制,以MVC为例

  登录

  因为用户是在权限系统里,所以登录也由权限系统来提供  

public ActionResult Login(string userName, string passWord, string verifyCode)
{
string error; bool a = CRL.RoleAuthorize.EmployeeBusiness.Instance.CheckPass(userName, passWord, out error);//验证密码
if (!a)
{
ModelState.AddModelError("", error);
return View();
} var u = CRL.RoleAuthorize.EmployeeBusiness.Instance.QueryItem(b => b.AccountNo == userName);
CRL.RoleAuthorize.EmployeeBusiness.Instance.Login(u, "admin", false);//FORM 验证登录
CRL.RoleAuthorize.MenuBusiness.Instance.RemoveUserMenuCache(u.Id, );//清除用户菜单缓存
string returnUrl = Request["returnUrl"];
if (string.IsNullOrEmpty(returnUrl))
{
returnUrl = "/";
}
return Redirect(returnUrl);
}

  布署菜单

  登录后需要显示当前用户可用菜单

  获取菜单分组

var menus = new Dictionary<CRL.RoleAuthorize.Menu, List<CRL.RoleAuthorize.Menu>>();
string url = System.Web.HttpContext.Current.Request.Url.PathAndQuery.ToLower(); var currentUser = CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser;//获取当前登录用户
  //获取系统编号为1的菜单,注意改这里
menus = CRL.RoleAuthorize.MenuBusiness.Instance.GetUserMenuByGroup(CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser.Id, );

  显示菜单

@foreach (var item in menus.Keys)//循环主菜单
{
var childs = menus[item];
<h2>@item.Name</h2>
<ul>
@foreach (var item2 in childs)//子菜单
{
if (!item2.ShowInNav)//不在导航显示则跳过
{
continue;
}
<li>
<a href="@item2.Url" rel="external nofollow" title="@item2.Name">@item2.Name</a>
</li>
}
</ul>
}

  实现权限控制

  MVC路径都是基于控制器的,很好控制,在基类实现权限检测方法  

/// <summary>
/// 对应当前系统ID
/// </summary>
int currentSystemId = ;
/// <summary>
/// 当前登录用户
/// </summary>
public CRL.Person.IPerson CurrentUser
{
get
{
return CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser;
}
}
/// <summary>
/// 访问权限检查,按当前请求路径
/// </summary>
/// <returns></returns>
public bool CheckAccess()
{
bool a = CRL.RoleAuthorize.AccessControlBusiness.Instance.CheckAccess(currentSystemId, CurrentUser.Id);
return a;
}

  在控制器方法里调用该方法

public ActionResult Update()
{
if (!CheckAccess())
{
return Content("没有权限");
}
return Content("访问成功");
}

到这里,权限系统就能正常工作了,由于使用了缓存,菜单查找效率非常高,可能会造成菜单不同步的情况,需要清空缓存

项目里自带了一个测试项目,更改项目里DBConnection文件夹,.config数据连接文件,连接正确的SQL数据库

运行RoleControl项目,登录 用户名:admin 密码:admin (如需更改,更改/config/CustomSetting.config) 加入测试菜单CRL通用权限控制系统

运行RoleControlWebTest 登录 用户名:test 密码:test

项目下载地址: 百度盘

最新3.0代码请入群获取

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,999
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,511
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,357
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,140
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848