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权限认证 ...
随机推荐
- POI操作Excel详解,读取xls和xlsx格式的文件
package org.ian.webutil; import java.io.File; import java.io.FileInputStream; import java.io.FileN ...
- spfa最短路径
C++代码 #include <iostream> #include <deque> #include <stack> #include <vector> ...
- jquery基础学习之AJAX篇(五)
理解不深,只知道这么用 jquery 中ajax的请求方法 $.ajax({ url:‘http://...’, //请求网址 type:'GET', //请求方法 success:function( ...
- nodejs构建mock数据
Nodejs构建mock数据并通过rest api风格调用接口访问数据 如果我们只有json格式的数据文件,我们想通过访问url方式调用居然数据 确保电脑安装node环境 如果你没有安装好node环境 ...
- sql中遍历字符串
在sql或者存储过程中会需要遍历字符串. ), --如111,222,333,尾部加, ), @Id int, ) set @split = ',' ) begin ,) ,charindex(@sp ...
- js篇-解析url链接里面的参数名和参数值
项目背景是,链接为:https://paladin.pingan.com.cn/jf/?appId=PA00200000000_01_APP&id=123456#/fundRank 要求拿到: ...
- qrcode插件生成二维码
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- node(03)--利用 HTTP 模块 URl 模块 PATH 模块 FS 模块创建一个 WEB 服务器
Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的三个 We ...
- Linux+DDoS deflate 预防DDoS攻击
使用DDoS脚本防止DDoS攻击 使用DDoS脚本防止DDoS攻击: DDoS概述: 分布式拒绝服务(DDoS:Distributed Denial of Service)攻击,指借助于客户/服务 ...
- html5 p1练习1,移动页面,标准标签布局
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...