基于RBAC的权限框架
RBAC权限框架(Role-Based Access Control)基于角色的权限访问控制的框架,通过用户-角色-权限的关联,非常方便的进行权限管理,在这里不再说明什么是RBAC,请自行百度.
谢谢大家的捧场,如文章中有错误或者,请联系我或者给我发邮件linjie.rd@gmail.com,修正后将会有小礼品送出,谢谢
思路
小张、小王、小李要去动物园看动物,小张和小王提前在网上买好票了,小李没买到票。
三人到了动物园公共展区,这里不需要验票,三人可以看这一片的动物(允许匿名访问)。
继续向前走,到了特别展区,需要验证门票,小张和小王有门票顺利的进入特别展区,小李被拦了下来(身份认证)。
小李不甘心啊,找了个角落,偷偷翻墙景区,结果被景区人员抓了被带到了警察局进行教育(非法访问)。
小王在特别展区嫌慢,自己偷偷一不小心走到没有权限的地方而被抓。
相对关系
权限:权限是指是否允许可被访问(被查看)和被使用的一种手段,通常设计具有上下级的关系,在本文中用的是树形结构。
用户:该操作系统的使用者,通过这个操作系统来完成某部分的工作生活。
角色:对用户的一种分类,对权限的一中整理,比如:普通员工有普通员工的权限,经理又经理 的权限。
在实际生活中,一个人有多个身份,比如,爸爸妈妈的孩子,孩子的父母,上班的职工等等。而一个公司的普通员工就有很多人。so,用户和角色是多对多的关系。
而一个角色,也可能有多个权限。比如,一个医生除了治病救人之外,也可以医疗护理。一个警察在打击犯罪的同时,也可以根据法律法规帮助别人。
而一个权限,可能是多个角色拥有的。一个警察在打击犯罪,普通市民也可以参与。往往一件事的事情(类比于一个权限),会有多个角色的参与。
所以,角色和权限也是多对多的关系
数据库设计
因为是RBAC,所以肯定有用户、角色、权限,用户和角色是多对多的关系,角色和权限是多对多的关系。所以,需要有用户表、用户角色关联表、角色表、角色权限关联表、权限表。
用户表:用户代码、用户名、密码。
角色表:角色代码、角色名称。
用户角色关联表:用户代码、角色代码。
权限表:权限代码、权限名称、链接地址、父级权限代码。
角色权限关联表:角色代码、权限代码。
这些已经是基础的表,往往生活工作中会比这复杂多了。在有的时候,还需要特殊用户权限关联管理表。
程序的设计
根据需求,管理员可以管理权限和维护用户信息等,用户可以实现自己的任务需求。
那么,最基础的是获取权限和判断是否有相应的权限,在页面上展示相应 的功能呢以及在操作的时候判断有木有操作的权限。
比如管理员登陆,可以添加角色用户权限等。而用户登录,能够管理商品,订单的信息等。
环境
使用vs2015,sql server2017编程,Win10 Home x64系统软件,兼容IE8,IE9,IE10,谷歌浏览器等,使用PowerDesigner建模,等等
框架技术
整体框架使用了MVC+多层,页面使用了MiniUI框架,考虑到用户量不是很多,使用了Code First。
Code
由于保密条例,不展示业务部分,只有权限
* 获取权限,用户登录后,根据用户所属的角色信息获取相应的权限。
* 判断是否有权限,在用户进行操作前判断是否有权限
实现
*登录: 用户打开网站时,首先判断当前页面不允许匿名访问,判断Session是否有用户会话信息,存在则加载用户信息,不存在读取Cookie,Cookie有登录信息并且没有过期,这加载用户信息,否者跳转登录页面
登录成功之后或者加载完用户信息之后,获取权限列表,显示对应的模块
* 操作: 当用户点击功能后或者在地址栏里输入地址访问,首先通过面向切面编程的思路,使用动作过滤器或者权限过滤器判断是否有对应的权限,有权限就允许操作,没有权限则视为无效操作或者非法操作
无效操作: 返回上一页或者上一步
非法操作: 清空登录信息,清空Session,释放Cookie,跳转到非法访问警告页面,3秒后跳转到登录页面
---------------- Common ----------------
public class UserPermissionFilter:System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
#region 判断是否有 此 controller 和 action 的权限
LoginUserViewModel user = AdminUserBll.GetLoginUser();
var permissionListAll = ModuleBll.Instance.GetLevelModuleListIsArrayAllInCache();
if (null != user && !string.IsNullOrEmpty(user.user_name))
{
bool ret = true;
if (user.PermissionList != null && user.PermissionList.Count > )
{
string action = filterContext.ActionDescriptor.ActionName;
string controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
string url = (controller + "/" + action).ToUpper();
var module = permissionListAll.FirstOrDefault(c => c.action_url.ToUpper() == url);
if ((controller.ToUpper() != "HOME" && action.ToUpper() != "LOGIN") &&
controller.ToUpper() != "MENU" && module != null) /*此Action下的不作权限*/
//&& module != null
{
ret = AdminUserBll.LoginUserIsPermission(controller, action, user);
}
if (!ret)
{
filterContext.HttpContext.Response.Redirect("/Home/NoRight", true);
//throw new System.Web.HttpException(403, "无权访问");
}
}
}
else
{
filterContext.HttpContext.Response.Redirect("/login", true); } #endregion base.OnActionExecuting(filterContext);
}
}
判读是否有操作权限
/// <summary>
/// 获取全部一维的模块View列表,在缓存中
/// </summary>
/// <returns></returns>
public List<LevelModuleViewModel> GetLevelModuleListIsArrayAllInCache()
{
return SystemCacheManager.GetCache("ModuleBll_GetLevelModuleListIsArrayAllInCache", , GetLevelMudleListIsArrayAll);
}
在缓存中获取模块列表
public static class SystemCacheManager
{
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="timeOut"></param>
/// <param name="function"></param>
/// <returns></returns>
public static T GetCache<T>(string key, int timeOut, Func<T> function)
{
if (string.IsNullOrEmpty(key)) return default(T);
var configs = HttpContext.Current.Cache[key];
if (configs == null)
{
configs = function();
if (timeOut > -)
{
HttpContext.Current.Cache.Insert(key, configs,
null, DateTime.Now.AddSeconds(timeOut),
System.Web.Caching.Cache.NoSlidingExpiration);
}
else
{
HttpContext.Current.Cache.Insert(key, configs);
}
return (T)configs;
}
return (T)configs;
} /// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="timeOut"></param>
/// <param name="function"></param>
/// <returns></returns>
public static T GetCache<T,Z>(string key, int timeOut, Func<Z,T> function,Z u1)
{
if (string.IsNullOrEmpty(key)) return default(T);
var configs = HttpContext.Current.Cache[key];
if (configs == null)
{
configs = function(u1);
if (timeOut > -)
{
HttpContext.Current.Cache.Insert(key, configs,
null, DateTime.Now.AddSeconds(timeOut),
System.Web.Caching.Cache.NoSlidingExpiration);
}
else
{
HttpContext.Current.Cache.Insert(key, configs);
}
return (T)configs;
}
return (T)configs;
}
}
获取缓存数据
/// <summary>
/// 判断登录用户对请求是否有权限
/// </summary>
/// <param name="controller"></param>
/// <param name="action"></param>
/// <param name="login"></param>
/// <returns></returns>
public static bool LoginUserIsPermission(string controller, string action, LoginUserViewModel login)
{
if (login.PermissionList != null && login.PermissionList.Count > )
{
string strUrl = controller + "/" + action;
if (login.PermissionList.FirstOrDefault(c => c.action_url.ToUpper() == strUrl.ToUpper()) != null)
{
return true;
}
}
return false;
}
判断用户对当前请求是否有操作权限
/// <summary>
/// 获取登录用户
/// </summary>
/// <returns></returns>
public static LoginUserViewModel GetLoginUser()
{
if (System.Web.HttpContext.Current.Session["LoginUser"] != null)
{
return (LoginUserViewModel)System.Web.HttpContext.Current.Session["LoginUser"];
}
else
{
string userName = Library.Web.Cookie.CookieManager.GetCookie(userCookieKey);
if (!string.IsNullOrEmpty(userName))
{
userName = StringDes.DesDecrypt(userName);
AdminUserDb user = Instance.GetModel(userName);
if (user != null)
{
LoginUserViewModel view = Instance.IniLogin(user);
return view;
}
}
}
return new LoginUserViewModel();
}
在Session和Cookie中获取登录用户
public ActionResult Login(string loginName, string passWord)
{ ViewBag.LoginName = loginName;
ViewBag.PassWord = passWord;
ViewBag.ErrorMessage = "";
string md5PassWord = Library.Tools.Text.StringMd5.Md5Hash32Salt(passWord);
AdminUserDb user = AdminUserBll.Instance.GetModel(loginName);
if (user != null)
{
if (user.pass_word.ToUpper() == md5PassWord.ToUpper()&&user.user_status==)
{
user.last_lgoin_date = DateTime.Now;
user.last_login_ip = Request.UserHostAddress;
AdminUserBll.Instance.IniLogin(user);
return RedirectToAction("Index", "Home");
}
else
{
ViewBag.errorMessage = "用户密码错误";
}
}
else
{
ViewBag.errorMessage = "用户密码错误";
}
return View();
}
用户登录
/// <summary>
/// 获取指定用户名的用户
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
public AdminUserDb GetModel(string userName)
{ return PermissionDal.GetModel(c => c.user_name == userName); }
获取用户信息
/// <summary>
/// 初始化登录用户
/// </summary>
/// <param name="user">登录用户</param>
/// <returns></returns>
public LoginUserViewModel IniLogin(AdminUserDb user)
{
if (user != null)
{
LoginUserViewModel loginUserViewModel = new LoginUserViewModel();
loginUserViewModel.user_full_name = user.user_full_name;
loginUserViewModel.user_name = user.user_name;
List<ModuleDb> moduleDbList = ModuleBll.Instance.GetModuleList(user.user_name).ToList();
if (moduleDbList != null && moduleDbList.Count > )
{
loginUserViewModel.PermissionList = moduleDbList;
loginUserViewModel.PermissionListLevel = ModuleBll.Instance.IniLevelModuleList(moduleDbList);
}
UpdateUserLogin(user);
System.Web.HttpContext.Current.Session["LoginUser"] = loginUserViewModel;
Library.Web.Cookie.CookieManager.SetCookie(userCookieKey, StringDes.DesEncrypt(loginUserViewModel.user_name));
return loginUserViewModel;
}
return new LoginUserViewModel();
}
初始化用户信息
--CREATE DATABASE center
--USE center
--GO
CREATE TABLE [dbo].[admin_user](
[user_name] [nvarchar](50) PRIMARY KEY NOT NULL,
[pass_word] [nvarchar](100) NOT NULL,
[user_full_name] [nvarchar](100) NULL,
[user_status] [int] NOT NULL,
[last_lgoin_date] [datetime] NULL,
[last_login_ip] [nvarchar](255) NULL,
[creator_name] [nvarchar](50) NOT NULL,
[creator_date] [datetime] NOT NULL,
[modifi_name] [nvarchar](50) NULL,
[modifi_date] [datetime] NULL,
[user_img] [varchar](max) NULL
)
GO CREATE TABLE [dbo].[admin_user_role_relation](
[id] [INT] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[user_name] [nvarchar](50) NOT NULL,
[role_id] [int] NOT NULL,
[creator_name] [nvarchar](50) NOT NULL,
[creator_date] [datetime] NOT NULL
)
GO CREATE TABLE [dbo].[dictionary_table](
[dt_key] [nvarchar](100) PRIMARY KEY NOT NULL,
[dt_type_key] [nvarchar](100) NOT NULL,
[dt_name] [nvarchar](100) NOT NULL,
[dt_status] [int] NOT NULL,
[dt_orderby] [decimal](18, 2) NOT NULL,
[creator_name] [nvarchar](50) NOT NULL,
[creator_date] [datetime] NOT NULL,
[modifi_name] [nvarchar](50) NULL,
[modifi_date] [datetime] NULL
)
GO CREATE TABLE [dbo].[dictionary_type_table](
[dt_type_key] [nvarchar](100) PRIMARY KEY NOT NULL,
[dt_type_name] [nvarchar](100) NOT NULL,
[dt_type_remark] [nvarchar](200) NULL,
[dt_type_orderby] [decimal](18, 0) NOT NULL,
[creator_name] [nvarchar](50) NOT NULL,
[creator_date] [datetime] NOT NULL,
[modifi_name] [nvarchar](50) NULL,
[modifi_date] [datetime] NULL
)
GO CREATE TABLE [dbo].[module_db](
[module_code] [nvarchar](50) PRIMARY KEY NOT NULL,
[module_name] [nvarchar](100) NOT NULL,
[parent_code] [nvarchar](50) NOT NULL,
[module_level] [int] NOT NULL,
[is_menu] [int] NOT NULL,
[is_action] [int] NOT NULL,
[action_url] [nvarchar](500) NULL,
[order_by] [decimal](10, 0) NOT NULL,
[module_status] [int] NOT NULL,
[creator_name] [nvarchar](50) NOT NULL,
[creator_date] [datetime] NOT NULL,
[modifi_name] [nvarchar](50) NULL,
[modifi_date] [datetime] NULL
)
GO CREATE TABLE [dbo].[role_db](
[role_id] [INT] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[role_name] [nvarchar](50) NOT NULL,
[role_status] [int] NOT NULL,
[creator_name] [nvarchar](50) NOT NULL,
[creator_date] [datetime] NOT NULL,
[modifi_name] [nvarchar](50) NULL,
[modifi_date] [datetime] NULL
)
GO CREATE TABLE [dbo].[role_module_relation](
[id] [INT] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[role_id] [int] NOT NULL,
[module_code] [nvarchar](255) NOT NULL,
[creator_name] [nvarchar](50) NOT NULL,
[creator_date] [datetime] NOT NULL
)
GO
INSERT [dbo].[admin_user] ([user_name], [pass_word], [user_full_name], [user_status], [last_lgoin_date], [last_login_ip], [creator_name], [creator_date], [modifi_name], [modifi_date], [user_img]) VALUES (N'adm', N'dc2e86a6ae8315a3da26cae880baae8e', N'adm', 1, NULL, NULL, N'admin', CAST(N'2019-05-28T12:44:12.380' AS DateTime), NULL, NULL, NULL)
INSERT [dbo].[admin_user] ([user_name], [pass_word], [user_full_name], [user_status], [last_lgoin_date], [last_login_ip], [creator_name], [creator_date], [modifi_name], [modifi_date], [user_img]) VALUES (N'admin', N'dc2e86a6ae8315a3da26cae880baae8e', N'管理员', 1, CAST(N'2019-05-28T14:48:15.503' AS DateTime), N'::1', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), NULL, NULL, NULL)
INSERT [dbo].[admin_user] ([user_name], [pass_word], [user_full_name], [user_status], [last_lgoin_date], [last_login_ip], [creator_name], [creator_date], [modifi_name], [modifi_date], [user_img]) VALUES (N'test', N'dc2e86a6ae8315a3da26cae880baae8e', N'测试账户', 1, CAST(N'2019-05-21T11:29:30.137' AS DateTime), N'::1', N'admin', CAST(N'2019-05-05T14:02:23.687' AS DateTime), NULL, NULL, NULL)
SET IDENTITY_INSERT [dbo].[admin_user_role_relation] ON INSERT [dbo].[admin_user_role_relation] ([id], [user_name], [role_id], [creator_name], [creator_date]) VALUES (40, N'admin', 2, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[admin_user_role_relation] ([id], [user_name], [role_id], [creator_name], [creator_date]) VALUES (120, N'admin', 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[admin_user_role_relation] ([id], [user_name], [role_id], [creator_name], [creator_date]) VALUES (123, N'test', 2, N'admin', CAST(N'2019-05-05T14:02:23.687' AS DateTime))
INSERT [dbo].[admin_user_role_relation] ([id], [user_name], [role_id], [creator_name], [creator_date]) VALUES (124, N'adm', 1, N'admin', CAST(N'2019-05-28T12:44:12.380' AS DateTime))
INSERT [dbo].[admin_user_role_relation] ([id], [user_name], [role_id], [creator_name], [creator_date]) VALUES (125, N'adm', 2, N'admin', CAST(N'2019-05-28T12:44:12.380' AS DateTime))
SET IDENTITY_INSERT [dbo].[admin_user_role_relation] OFF
INSERT [dbo].[dictionary_table] ([dt_key], [dt_type_key], [dt_name], [dt_status], [dt_orderby], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-sex-false', N'fa-sex', N'女', 1, CAST(1.00 AS Decimal(18, 2)), N'admin', CAST(N'2019-05-07T13:51:17.207' AS DateTime), NULL, NULL)
INSERT [dbo].[dictionary_table] ([dt_key], [dt_type_key], [dt_name], [dt_status], [dt_orderby], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-sex-true', N'fa-sex', N'男', 1, CAST(0.00 AS Decimal(18, 2)), N'admin', CAST(N'2019-05-07T13:50:48.100' AS DateTime), NULL, NULL)
INSERT [dbo].[dictionary_type_table] ([dt_type_key], [dt_type_name], [dt_type_remark], [dt_type_orderby], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-sex', N'性别', N'性别', CAST(0 AS Decimal(18, 0)), N'admin', CAST(N'2019-05-07T13:49:48.733' AS DateTime), NULL, NULL)
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-book', N'字典管理', N'fa-puzzle-piece', 3, 1, 1, N'DictionaryManager/List', CAST(0 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), NULL, NULL)
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-desktop', N'系统管理', N'yixin_public', 2, 1, 2, N'', CAST(0 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-graduation-cap', N'模块菜单管理', N'fa-desktop', 3, 1, 1, N'ModuleManager/list', CAST(3 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-paw', N'角色管理', N'fa-desktop', 3, 1, 1, N'rolemanager/list', CAST(1 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), NULL, NULL)
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-puzzle-piece', N'配置管理', N'yixin_public', 2, 1, 2, N'', CAST(2 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), NULL, NULL)
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-th-list', N'字典类别管理', N'fa-puzzle-piece', 3, 1, 1, N'DictionaryTypeManager/List', CAST(1 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'fa-user', N'用户管理', N'fa-desktop', 3, 1, 1, N'AdminUserManager/list', CAST(3 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), NULL, NULL)
INSERT [dbo].[module_db] ([module_code], [module_name], [parent_code], [module_level], [is_menu], [is_action], [action_url], [order_by], [module_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (N'yixin_public', N'XX公共平台', N'', 1, 1, 2, N'', CAST(0 AS Decimal(10, 0)), 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), N'admin', NULL)
SET IDENTITY_INSERT [dbo].[role_db] ON INSERT [dbo].[role_db] ([role_id], [role_name], [role_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (1, N'管理员', 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_db] ([role_id], [role_name], [role_status], [creator_name], [creator_date], [modifi_name], [modifi_date]) VALUES (2, N'用户', 1, N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime), N'admin', CAST(N'2019-05-21T11:29:05.307' AS DateTime))
SET IDENTITY_INSERT [dbo].[role_db] OFF
SET IDENTITY_INSERT [dbo].[role_module_relation] ON INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (127, 1, N'yixin_public', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (128, 1, N'fa-desktop', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (131, 1, N'fa-puzzle-piece', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (132, 1, N'fa-paw', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (133, 1, N'fa-graduation-cap', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (134, 1, N'fa-user', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (135, 1, N'fa-th-list', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (136, 1, N'fa-book', N'admin', CAST(N'2019-05-01T00:00:00.000' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (1226, 2, N'yixin_public', N'admin', CAST(N'2019-05-21T11:29:05.307' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (1227, 2, N'afghfeat', N'admin', CAST(N'2019-05-21T11:29:05.307' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (1228, 2, N'fa-puzzle-piece', N'admin', CAST(N'2019-05-21T11:29:05.307' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (1229, 2, N'fa-book', N'admin', CAST(N'2019-05-21T11:29:05.307' AS DateTime))
INSERT [dbo].[role_module_relation] ([id], [role_id], [module_code], [creator_name], [creator_date]) VALUES (1230, 2, N'fa-th-list', N'admin', CAST(N'2019-05-21T11:29:05.307' AS DateTime))
SET IDENTITY_INSERT [dbo].[role_module_relation] OFF
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'user_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户密码 ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'pass_word'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户全名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'user_full_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户状态 1:有效 2:无效' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'user_status'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'最后登录日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'last_lgoin_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'最后登录ip' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'last_login_ip'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人登录名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'creator_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'creator_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改人登录名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'modifi_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user', @level2type=N'COLUMN',@level2name=N'modifi_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人登录名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user_role_relation', @level2type=N'COLUMN',@level2name=N'creator_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'admin_user_role_relation', @level2type=N'COLUMN',@level2name=N'creator_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字典key' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'dt_key'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字典类别key' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'dt_type_key'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字典名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'dt_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字典状态 1:有效 2:无效' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'dt_status'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'排序字段' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'dt_orderby'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人登陆名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'creator_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'creator_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改人登录名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'modifi_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_table', @level2type=N'COLUMN',@level2name=N'modifi_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字典类别' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_type_table', @level2type=N'COLUMN',@level2name=N'dt_type_key'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字典类别名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_type_table', @level2type=N'COLUMN',@level2name=N'dt_type_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字典类别备注' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_type_table', @level2type=N'COLUMN',@level2name=N'dt_type_remark'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_type_table', @level2type=N'COLUMN',@level2name=N'creator_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_type_table', @level2type=N'COLUMN',@level2name=N'creator_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改人' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_type_table', @level2type=N'COLUMN',@level2name=N'modifi_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'dictionary_type_table', @level2type=N'COLUMN',@level2name=N'modifi_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'module_code'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'module_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'父模块code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'parent_code'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块级别' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'module_level'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否是菜单 1:菜单 2:不是菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'is_menu'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否是菜单 1:请求 2:不是菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'is_action'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'请求url' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'action_url'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'排序字段' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'order_by'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块状态 1:有效 2:无效' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'module_status'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人用户名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'creator_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'creator_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改用户名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'modifi_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'修改日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'module_db', @level2type=N'COLUMN',@level2name=N'modifi_date'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'角色id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'role_module_relation', @level2type=N'COLUMN',@level2name=N'role_id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'role_module_relation', @level2type=N'COLUMN',@level2name=N'module_code'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建用户名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'role_module_relation', @level2type=N'COLUMN',@level2name=N'creator_name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'role_module_relation', @level2type=N'COLUMN',@level2name=N'creator_date'
GO
数据库代码
源码 : https://github.com/linjierd/Jurisdiction
[仅限于下载学习,不允许用于商业用途]
基于RBAC的权限框架的更多相关文章
- Spring Security实现基于RBAC的权限表达式动态访问控制
昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...
- 基于RBAC实现权限管理
基于RBAC实现权限管理 技术栈:SpringBoot.SpringMVC RBAC RBAC数据库表 主体 编号 账号 密码 001 admin 123456 资源 编号 资源名称 访问路径 001 ...
- ThinkPHP框架下基于RBAC的权限控制模式详解
这几天因为要做一个项目,需要可以对Web应用中通用功能进行封装,其中一个很重要的涉及到了对用户.角色和权限部分的灵活管理.所以基于TP框架自己封装了一个对操作权限和菜单权限进行灵活配置的可控制模式. ...
- 基于RBAC的权限设计模型
个部件模型组成,这4个部件模型分别是基本模型RBAC0(Core RBAC).角色分级模型RBAC1(Hierarchal RBAC).角色限制模型RBAC2(Constraint RBAC)和统一模 ...
- 基于RBAC的权限控制浅析(结合Spring Security)
嗯,昨天面试让讲我的项目,让我讲讲项目里权限控制那一块的,讲的很烂.所以整理一下. 按照面试官的提问流程来讲: 一.RBAC是个啥东西了? RBAC(Role-Based Access Control ...
- 权限管理系统(五):RBAC新解,基于资源的权限管理
本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的.同时我将讨论一种我认为更好的权限管理方式. 1.什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念.角色是 ...
- 图文详解基于角色的权限控制模型RBAC
我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问.操作.数据权限.形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control).强制 ...
- 基于vue(element ui) + ssm + shiro 的权限框架
zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...
- 基于RBAC模型的通用企业权限管理系统
1. 为什么我们需要基于RBAC模型的通用企业权限管理系统 管理信息系统是一个复杂的人机交互系统,其中每个具体环节都可能受到安全威胁.构建强健的权限管理系统,保证管理信息系统的安全性是十分重要的.权限 ...
随机推荐
- VS2013日常使用若干技巧+快捷键
1.注释的方法 1)sqlserver中,单行注释:— — 多行注释:/* 代码 */ 2)C#中,单行注释:// 多行注释:/* 代码 */ 3)C#中多行注释的快捷方式:先选中你要注 ...
- PLT与GOT
0x01 什么是PLT和GOT 名称: PLT : 程序链接表(PLT,Procedure Link Table) GOT : 重局偏移表(GOT, Global Offset Table) 缘由: ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- mysql in与exists问题剖析
1 问题描述 发布当天发现一个日志分析的sql,在测试环境上执行良好,1秒内,而在线上环境上,执行要13秒左右. 嵌套sql一步一步分析后,发现出在in上,因时间紧迫,来补不及具体分析原因,尝试使 ...
- C语言指针专题——如何理解指针
本文为原创,欢迎转发! 最近在研读C primer plus 5版中文版,老外写的,还是很经典的,推荐给读者们,有需要的朋友可以在这里购买:C primer plus 5版中文版 指针,传说中是C语言 ...
- Java连载6-变量的要求
一.数据类型的作用 (1)不同的数据有不同的类型,不同的数据类型底层会分配不同的大小的空间 (2)数据类型是指程序在运行阶段应该分配多大的内存空间 二.变量要求 变量中存储的具体的“数据”必须和变量的 ...
- CitusDB UPSERT
CitusDB的upsert功能 postgresql9.5 版本支持 "UPSERT" 特性, 这个特性支持 INSERT 语句定义 ON CONFLICT DO UPDATE/ ...
- 【题解】埃及分数-C++
Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的. 对于一个分数a/ ...
- Java中的Lambda表达式简介及应用
在接触Lambda表达式.了解其作用之前,首先来看一下,不用Lambda的时候我们是怎么来做事情的. 我们的需求是,创建一个动物(Animal)的列表,里面有动物的物种名,以及这种动物是否会跳,是否会 ...
- springboot项目问题记录one
上面三个方法描述如下: 首先有个业务,我是需要调取第三方一个sdk,然后sdk里面封装的kafka,也就是说,需要用sdk内置的连接kafka去消费消息,然后又有一个类需要实现Message,此Mes ...