web系统权限设计
应该有七张表
1.appSystem 表;
主要在多系统中的 统一权限管理;主要就是系统的URL
USE [Star_Permission]
GO /****** 对象: Table [dbo].[AppSystem] 脚本日期: 2016/9/22 14:45:31 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[AppSystem] (
[AppCode] CHAR (8) NOT NULL,
[AppName] NVARCHAR (50) NOT NULL,
[Url] NVARCHAR (200) NULL,
[CreateTime] DATETIME NOT NULL,
[ModifyTime] DATETIME NULL,
[CreateBy] INT NOT NULL,
[ModifyBy] INT NULL,
[Remark] NVARCHAR (200) NULL
);
2.Funtion表
然后就是我们的Function表;主要是我们的额菜单功能;{xxContorlller/Index}
会有appCode 和 自己的 FunCode
USE [Star_Permission]
GO /****** 对象: Table [dbo].[Funcation] 脚本日期: 2016/9/22 14:49:47 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[Funcation] (
[FunCode] NVARCHAR (50) NOT NULL,
[AppCode] NVARCHAR (50) NOT NULL,
[FunName] NVARCHAR (20) NOT NULL,
[ParentID] NVARCHAR (50) NOT NULL,
[PageUrl] NVARCHAR (200) NULL,
[IsMenu] INT NULL,
[Icon] VARCHAR (200) NULL,
[CreateTime] DATETIME NOT NULL,
[ModifyTime] DATETIME NULL,
[CreateBy] INT NOT NULL,
[ModifyBy] INT NULL,
[Remark] NVARCHAR (200) NULL
);
3.FunAction表
主要是控制我们的action的权限。主要是controller下的action控制;
会自己的ActionCode和FunCode
USE [Star_Permission]
GO /****** 对象: Table [dbo].[Funcation] 脚本日期: 2016/9/22 14:51:35 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[Funcation] (
[FunCode] NVARCHAR (50) NOT NULL,
[AppCode] NVARCHAR (50) NOT NULL,
[FunName] NVARCHAR (20) NOT NULL,
[ParentID] NVARCHAR (50) NOT NULL,
[PageUrl] NVARCHAR (200) NULL,
[IsMenu] INT NULL,
[Icon] VARCHAR (200) NULL,
[CreateTime] DATETIME NOT NULL,
[ModifyTime] DATETIME NULL,
[CreateBy] INT NOT NULL,
[ModifyBy] INT NULL,
[Remark] NVARCHAR (200) NULL
);
4.systemRole表
这个就是web系统额角色;主要就有个RoleID和RoleName
USE [Star_Permission]
GO /****** 对象: Table [dbo].[SysRole] 脚本日期: 2016/9/22 14:55:30 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[SysRole] (
[RoleID] NVARCHAR (50) NOT NULL,
[RoleName] NVARCHAR (20) NOT NULL,
[Status] INT NULL,
[CreateTime] DATETIME NOT NULL,
[ModifyTime] DATETIME NULL,
[CreateBy] INT NOT NULL,
[ModifyBy] INT NULL
);
5.当然也会有我们的SystemUser表的呀
主要就一个UserID 和 UserName
6.UserRole
一个用户可以有多个角色,
一个角色可以别多个用户所拥有。
主要就是userID 和 roleID
USE [Star_Permission]
GO /****** 对象: Table [dbo].[UserRole] 脚本日期: 2016/9/22 15:02:28 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[UserRole] (
[UserID] VARCHAR (30) NOT NULL,
[RoleID] NVARCHAR (50) NOT NULL,
[CreateTime] SMALLDATETIME NOT NULL,
[CreateBy] INT NOT NULL,
[ID] BIGINT IDENTITY (1, 1) NOT NULL
);
7.RoleFun
同样一个角色可以有多个功能
一个功能可以被多个角色拥有
RoleID FunCode AcCode
USE [Star_Permission]
GO /****** 对象: Table [dbo].[SysRoleFun] 脚本日期: 2016/9/22 15:01:48 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[SysRoleFun] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[RoleID] NVARCHAR (50) NOT NULL,
[FunCode] NVARCHAR (50) NULL,
[ActCode] NVARCHAR (50) NULL,
[CreateTime] DATETIME NOT NULL,
[ModifyTime] DATETIME NULL,
[CreateBy] INT NOT NULL,
[ModifyBy] INT NULL
);
使用的时候,我们先从sql中进行过滤;
(ps,直接这样做,不太好,应该把过滤条件直接加在我们sql语句中取出来的)
/// <summary>
/// 获取用户权限
/// </summary>
/// <returns>List<UserPermissionDto>.</returns>
public List<UserPermissionDto> GetUserPermissionList()
{
string sql = @"
WITH RoleIds
AS ( SELECT RoleId ,
UserID
FROM dbo.UserRole AS R WITH ( NOLOCK )
),
Funs
AS ( SELECT M.UserID ,
M.RoleId ,
F.FunCode AS Code ,
F.PageUrl AS ActName
FROM RoleIds AS M
INNER JOIN dbo.SysRoleFun AS R WITH ( NOLOCK ) ON M.RoleId = R.RoleId
INNER JOIN dbo.Funcation AS F WITH ( NOLOCK ) ON F.FunCode = R.FunCode
),
Acts
AS ( SELECT M.UserID ,
M.RoleId ,
A.ActCode AS Code ,
A.ActName
FROM RoleIds AS M WITH ( NOLOCK )
INNER JOIN dbo.SysRoleFun AS R WITH ( NOLOCK ) ON M.RoleId = R.RoleId
INNER JOIN dbo.FunAction AS A WITH ( NOLOCK ) ON A.ActCode = R.ActCode
)
SELECT UserID , RoleId ,Code , ActName
FROM Funs
UNION
SELECT UserID ,RoleId ,Code ,ActName
FROM Acts
";
using (var dbScope = _dbScopeFactory.CreateReadOnly())
{
var db = dbScope.DbContexts.Get<MaybachDbContext>();
var list = db.Database.SqlQuery<UserPermissionDto>(sql); return list.ToList();
}
}
然后装入我们缓存中,
class CacheHelper
{
/// <returns >权限项列表 </returns >
public static List<UserPermissionDto> GetPermissionItems()
{
// 如果缓存中已经存在权限列表信息,则直接从缓存中读取。
if (HttpContext.Current.Cache["PermissionItems"] == null)
{
// 如果缓存中没有或者已经过期权限列表信息,则从数据库获取并写入缓存
var httpDto = IocConfig.Container.GetInstance<ISysRoleProvider>().GetUserPermissionList();
if (httpDto != null)
{
HttpContext.Current.Cache.Insert("PermissionItems", httpDto, null, DateTime.Now.AddMinutes(), TimeSpan.Zero);
}
}
return (List<UserPermissionDto>)HttpContext.Current.Cache["PermissionItems"];
}
}
然后就接着看我们下面的各种代码了滴呀;
然后添加,我们的过滤文件:


包含我们的授权,权限,异常处理,各种过滤器的地呀;
然后在onActionExecuting中 添加方法:
public class PermissionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
//AllowAnonymousAccess
var actionFilter = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowAnonymousAccess), false);
var controllerFilter = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AllowAnonymousAccess), false);
if (controllerFilter.Length == || actionFilter.Length == )
{
base.OnActionExecuting(filterContext);
return;
} var user = Thread.CurrentPrincipal.Identity as ClaimsIdentity;
var nickName = user.Claims.FirstOrDefault(r => r.Type == "nickname").Value;
var userId = user.GetLoginUserId(); //测试账户
if (string.Equals(nickName, "揉一", StringComparison.Ordinal))
{
base.OnActionExecuting(filterContext);
return;
} //var userDto = IocConfig.Container.GetInstance<IUserProvider>().GetUserByNickName(nickName);
//var permisionList = CacheHelper.GetPermissionItems();
var permisionList = CacheHelper.GetPermissionItems().FindAll(item => item.UserID == userId);
var atcion = $@"{filterContext.RouteData.Values["controller"]}/{filterContext.RouteData.Values["action"]}"; var isExists = permisionList.Exists(p => p.ActName.ToLower().Contains(atcion.ToLower()));
if (isExists)
{
base.OnActionExecuting(filterContext);
return;
}
else
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
var json = new JsonResult()
{
Data = new { Code = "", Message = "对不起,你没有操作权限!" },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.Result = json;
}
else
{
filterContext.Result = new RedirectResult("/NoPermission/Index");
}
}
}
}
}
然后......
web系统权限设计的更多相关文章
- 中小型WEB系统权限日志数据表设计
中小型WEB系统权限日志数据表设计 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjc1MDU3OA==/font/5a6L5L2T/fontsi ...
- SpringCloud微服务实战——搭建企业级开发框架(二十一):基于RBAC模型的系统权限设计
RBAC(基于角色的权限控制)模型的核心是在用户和权限之间引入了角色的概念.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来间接地赋予用户权限,从而达到用户和权限解耦的目的. R ...
- flask-login ----系统权限设计部分小结
tips: 事实证明.开发是一项苦力活.但是代码只有自己写的才是令人感到放心的.不过仅仅是从开发角度来说.从维护和安全角度来说,当然还是引入模块比较爽 但是引入的模块总会有一些问题.碰到的最大问题就是 ...
- 【大型web架构】一个大型web系统架构设计和技术选型的讨论摘录
1.数据库压力问题 所有的压力最终都会反映到数据库方面,一定要对数据库有一个整体的规划. 可以按照业务.区域等等特性对数据库进行配置,可以考虑分库.使用rac.分区.分表等等策略,确保数据库能正常的进 ...
- web系统架构设计中需要知道的点(前端篇)
上周没写东西,这周写点互联网系统开发中需要了解的技术点,每个点都可以发散出去,连接更多的知识点,打算做个逐步细化的记录. 一个应用的整个生命周期中(生,老,病,死)都需要有一个整体规划. 前期 评估需 ...
- JEECMS 系统权限设计
1.用户校验. 登录校验主要围绕着用户后台登陆的url拦截 a.围绕着用户登录过程中设计到两张用户表 jc_user:存储着用户的基本信息 jo_user:存储着用户登录.注册.更新时间及用户密码信息 ...
- 2017(5)软件架构设计,web系统的架构设计,数据库系统,分布式数据库
试题五(共 25 分) 阅读以下关于 Web 系统架构设计的叙述,在答题纸上回答问题1 至问题 3. [说明] 某公司开发的 B2C 商务平台因业务扩展,导致系统访问量不断增大,现有系统访问速度缓慢, ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据 ...
- asp.net web网站权限系统的简单设计
权限设计总结一句话就是:拥有权限的主体来管控系统的各种资源资源,及在资源上体现的各种操作. 概括来说就是,权限离不开三要素: 1:权限的主体 2:管控的资源 3:各种操作 现对三要素分别做简单的阐述 ...
随机推荐
- UVA 10325 - The Lottery(容斥)
以前做过的一个题,忘记/gcd了,看来需要把以前的东西看一下啊. #include <cstdio> #include <cstring> #include <iostr ...
- POJ 1724 ROADS(二维SPFA)
题目链接 用STL实现超时了,用普通队列500+,看到spfa,反应太迟钝了. #include <cstring> #include <cstdio> #include &l ...
- 基于SpringMVC框架项目Demo
Git地址:https://github.com/JavaWeb1024/SpringMVC 1. 框架简介: 为打造一套集群高可用的框架,集成的技术目前比较成熟,稳定.相关的知识点在网络上也 ...
- https的了解
经常用支付宝,看到了https就查了一下. HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议. 简单讲是HTTP的安全版.即HTTP下加入SSL层, ...
- 通过ReflectionMethod,我们可以得到Person类的某个方法的信息
PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互.借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传 ...
- Web服务器上可能被包含或被请求的不同脚本源代码文件
Web服务器上可能被包含或被请求的不同脚本源代码文件的大致数量(建议值为1024~4096). ; 如果你不能确定,则设为 0 :此设定主要用于拥有数千个源文件的站点. apc.optimizatio ...
- [转].net自定义验证控件CustomValidator的使用
本文转自:http://tech.cncms.com/web/aspnet/96310.html CustomValidator验证控件,可以自定义验证函数,实现其它几个验证控件不能实现的验证规则,最 ...
- 【产品更新】EVC8013 硬件更新!
EVC8013 三合一磁耦合隔离转换器(USB转RS-232 / RS-485 / RS-422 ),迎来一次硬件大幅度升级,升级不加价! 本次升级主要有以下几个方面: 1.采用第二代金升阳 3000 ...
- 中文编码、字符集,GBK, UTF-8的概念
字符集指的是什么? 字符集是一个人为的规定,人们用一个小册子规定好"文字字符"与"数字"的对应关系. 其中,每一个字符对应的数组也称其为编码. 例如,ASCII ...
- css样式重置方案 -解决浏览器差异
1.http://meyerweb.com/eric/tools/css/reset/ /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 2011 ...