ABP权限认证
通过AOP+特性实现
ABP默认的权限验证过滤器 AbpAuthorizationFilter 可以通过继承AsyncAuthorizationFilter 自定义自己的权限过滤器
权限数据存放表 [AbpPermissions]
1.设置权限的class需要需要派生自AuthorizationProvider类
public class MyAuthorizationProvider : AuthorizationProvider
{
public override void SetPermissions(IPermissionDefinitionContext context)
{
var pages = context.CreatePermission(PermissionNames.Pages_Users, FL("后台页面")); //物料管理
var product = pages.CreateChildPermission(PermissionNames.Pages_Product, FL("物料管理"));
product.CreateChildPermission(PermissionNames.Pages_Product_CreateOrEdit, FL("添加修改物料"));
2.ABP中Application层需要进行权限验证 在Module中注册权限
public override void PreInitialize()
{
Configuration.Authorization.Providers.Add<MyAuthorizationProvider>();
}
3.在接口或方法上添加权限
所有权限都保存在 PermissionDictionary Permissions对象中 这个PermissionDictionary类型继承Dictionary<string, Permission>
权限就是一份存在内存中的数据字典
protected readonly PermissionDictionary Permissions;
权限对象(Permission):用于定义一个Permission,一个permission可以包含多个子Permission.
public class Permission
{
/// <summary>
/// Parent of this permission if one exists.
/// If set, this permission can be granted only if parent is granted.
/// </summary>
public Permission Parent { get; private set; } /// <summary>
/// List of child permissions. A child permission can be granted only if parent is granted.
/// </summary>
public IReadOnlyList<Permission> Children => _children.ToImmutableList();
private readonly List<Permission> _children;
验证权限的过程
找到当前请求需要执行的方法 找到当前方法继承权限的特性和当前方法所在的类继承的权限的特性
如果都不存在 直接通过
如果存在 循环存在的所有权限特性中的权限
去获取当前用户的权限 跟当前需要的权限进行匹配 全部匹配 就通过
可以自己注入 这个对象来检查权限
//检查是否存在当前的权限
public virtual async Task<bool> IsGrantedAsync(string permissionName)
{
return AbpSession.UserId.HasValue && await _userManager.IsGrantedAsync(AbpSession.UserId.Value, permissionName);
} public virtual async Task<bool> IsGrantedAsync(long userId, string permissionName)
{
return await _userManager.IsGrantedAsync(userId, permissionName);
}
//获取当前用户的所有权限
private async Task<UserPermissionCacheItem> GetUserPermissionCacheItemAsync(long userId)
{
var cacheKey = userId + "@" + (GetCurrentTenantId() ?? );
return await _cacheManager.GetUserPermissionCache().GetAsync(cacheKey, async () =>
{
var user = await FindByIdAsync(userId);
if (user == null)
{
return null;
} var newCacheItem = new UserPermissionCacheItem(userId); foreach (var roleName in await GetRolesAsync(userId))
{
newCacheItem.RoleIds.Add((await RoleManager.GetRoleByNameAsync(roleName)).Id);
} foreach (var permissionInfo in await UserPermissionStore.GetPermissionsAsync(userId))
{
//当前权限是否授予
if (permissionInfo.IsGranted)
{
//授予的权限
newCacheItem.GrantedPermissions.Add(permissionInfo.Name);
}
else
{
//禁止的权限
newCacheItem.ProhibitedPermissions.Add(permissionInfo.Name);
}
}
//当前用户的所有权限
return newCacheItem;
});
}
//检查是否有权限
//检查当前方法的权限是否在该用户的授予权限中
if (cacheItem.GrantedPermissions.Contains(permission.Name))
{
return true;
}
//禁止权限
if (cacheItem.ProhibitedPermissions.Contains(permission.Name))
{
return false;
}
ABP权限认证的更多相关文章
- ABP 权限拦截 第二篇
由于访问人数过多,我今天从新整理一下ABP权限认证机制,帮助大家更容易读懂 1.Abp 的权限拦截主要通过过滤器, public class AbpAuthorizationFilter : I ...
- 3.jenkins 权限认证与密码设置
1.前言 在用Jenkins过程中忘记管理员密码和开启权限认证后管理员帐号没有任何权限是经常遇到的情况,最近有好多群友被这个问题困扰.但Jenkins没有提供密码找回的功能,经过一翻探索找到了一种变相 ...
- 【Java EE 学习 20】【使用过滤器实现登陆验证、权限认证】【观察者模式和监听器(使用监听器实现统计在线IP、登录IP 、踢人功能)】
一.使用过滤器实现登录验证.权限认证 1.创建5张表 /*使用过滤器实现权限过滤功能*/ /**创建数据库*/ DROP DATABASE day20; CREATE DATABASE day20; ...
- 比RBAC更好的权限认证方式(Auth类认证)
Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了, ...
- mongodb3 权限认证问题总结
mongodb3 权限认证问题总结 标签(空格分隔): mongodb 权限 数据库 认证 ubuntu用户安装最新版本mongodb 添加key sudo apt-key adv --keyserv ...
- Codeigniter-实现权限认证
两种方法 钩子函数 集成核心Controller 方法一,钩子函数: 一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了,后来仿着jsp firter的方式用CI ...
- asp.net权限认证篇外:集成域账号登录
在之前的我们已经讲过asp.net权限认证:Windows认证,现在我们来讲讲域账号登录, 这不是同一件事哦,windows认证更多的是对资源访问的一种权限管控,而域账号登录更多的是针对用户登录的认证 ...
- asp.net权限认证:Windows认证
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- asp.net权限认证:Forms认证
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
随机推荐
- C++/C面试题
(1) 按位运算只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用: (2) 一般在打开网页时,需要在浏览器中输入网址,因此,需要通过网址找到访问资源的 IP 地址,从而可以把请求发送到对 ...
- nvm 淘宝镜像
找到里面的settings.txt node_mirror: https://npm.taobao.org/mirrors/node/npm_mirror: https://npm.taobao.or ...
- CentOS7.6 安装Docker
删除已安装的Docker # Uninstall installed docker sudo yum remove docker \ docker-client \ docker-client-lat ...
- iOS 微信打开第三方应用(Universal Links 和 URL Schemes)
一.前言 项目中时常有这种需求, 是通过链接跳转到应用内部,现在iOS主流的方案有两个 Schema: 常用在于一个应用跳转到另一个应用内部,属于应用间的跳转.当然ios9以下,网页可以通过schem ...
- 移动前端开发和 Web 前端开发的区别
http://www.itcast.cn/news/20180125/16033584753.shtml 1,普通PC端开发与移动端开发区别. 先说背景,我大言不惭的说一下,我pc端的前端开发干了有快 ...
- Qt自定义界面
https://blog.csdn.net/zhangxiaoyu_sy/article/details/78925221
- Postman 进阶(pre-request scripts&test script)
Postman 进阶 1. pre-request scripts pre-request scripts是一个关联了收藏夹内request,并且在发送request之前执行的代码片段.这对于在r ...
- JDK 1.8源码阅读 LinkList
一,前言 LinkedList是一个实现了List接口和Deque接口的双端链表.有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端. LinkedL ...
- 20165321 测试-3-ch02
- (已解决)jdk安装 系统找不到文件C:\ProgramData\Oracle\Java\javapath\java.exe
jdk安装好之后,也配置好了环境变量,打开cmd输入javac可以跳出相关信息,可是输入java却一直提示:系统找不到文件C:\ProgramData\Oracle\Java\javapath\jav ...