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权限认证 ...
随机推荐
- 使用正则表达式进行某网页中的email邮箱抽取
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; impo ...
- ASP.NET页面使用JQuery EasyUI生成Dialog后台取值为空
原因: JQuery EasyUI生成Dialog后原来的文档结构发生了变化,原本在form里的内容被移动form外面,提交到后台后就没有办法取值了. 解决办法: 在生成Dialog后将它append ...
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...
- UCloud首尔机房整体热迁移是这样炼成的
小结: 1.把两个机房在逻辑上变成一个机房: 2.新老机房的后端服务使用同一套 ZooKeeper,但是配置的却是不同的 IP: 3.UCloud内部服务所使用的数据库服务为MySQL, 内部MySQ ...
- [qemu][kvm] 在kvm嵌套kvm的虚拟机里启动kvm加速
常规情况下,如果在kvm的虚拟机里,又想使用kvm的虚拟机,会报如下的错误信息: [root@host0 nlb]# Could not access KVM kernel module: No su ...
- [daily] fedora用过光盘做dnf repo
有时候上不了网,或者你在一个网络下行受限的鬼地方上班.可是你需要给你的server装一个包. 这个时候,不妨用一下安装盘吧! 如下: 与redhat下用yum的时候,是一样一样的. 步骤如下: 1,插 ...
- 最全的MonkeyRunner自动化测试从入门到精通(5)
夜神模拟器的安装与配置步骤一:我们为什么会选择使用夜神模拟器呢? 众所周知,Android studio的模拟器运行速度也很快,可以媲美真机.虽然其运行速度很快,可以满足我们测试的需求.但仍存在以下问 ...
- QSS独门秘籍:subcontrol
QSS是C++ Qt中的界面美化神器,其语法和CSS区别不大,但是QSS有一个独有的功能——subcontrol,这是CSS所没有的,一个widget往往由多个子部件构成,利用subcontrol可以 ...
- Mybatis(二)总结
1. 输入映射(就是映射文件中可以传入哪些参数类型) 1)基本类型 2)pojo类型 3)Vo类型2. 输出映射(返回的结果集可以有哪些类型) 1)基本类型 2)pojo类型 3)List类型3. 动 ...
- .Net Core创建Docker镜像
1..Net Core项目[Lails.Server.Demo]发布到目录下Lails.Server.Demo\bin\Release\netcoreapp2.1\publish 2.上面目录下新建文 ...