PasteTemplate序列的接口权限控制使用的都是一套逻辑

包括不限于PasteSpider,PasteTimer,PasteTicker等

大致逻辑一致,具体的细节可能会根据项目做一些调整!

实现

项目中使用的是过滤器实现的RoleAttribute:ActionFilterAttribute

查找源代码大概看到如下代码

    /// <summary>
/// 这里的权限筛选器
/// </summary>
public class RoleAttribute : ActionFilterAttribute
{
/// <summary>
/// 权限
/// </summary>
private string _role { set; get; } /// <summary>
/// 角色
/// </summary>
private string _model { get; set; } /// <summary>
///
/// </summary>
private readonly ModelHelper _appCache; /// <summary>
///
/// </summary>
/// <param name="appcache"></param>
/// <param name="Model"></param>
/// <param name="Role"></param>
public RoleAttribute(
ModelHelper appcache,
string Model = default,
string Role = default
)
{
_role = Role;
_model = Model;
_appCache = appcache;
} /// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <exception cref="SmartToolException"></exception>
public override void OnActionExecuting(ActionExecutingContext context)
{
var needauth = true;
foreach (var item in context.Filters)
{
// Console.WriteLine(item.ToString()); 可以看看有多少过滤器被注入了
if (item is AllowAnonymousAttribute)
{
needauth = false;
break;
}
if (item is RoleAttribute)
{
needauth = (item == this);
}
}
if (needauth)
{
//authorization
if (context.HttpContext.Request.Headers[PublicString.TokenHeadName].Count == 0)
{
throw new SmartToolException("当前未登录,请登录后重试", "401");
}
var token = context.HttpContext.Request.Headers[PublicString.TokenHeadName].ToString();
if (token.StartsWith("Bearer"))
{
token = token.Replace("Bearer ", "");
} //// 获得当前用户信息后 如果要使用base.CurrentUser.的属性,下面要按需注入
//var list = new System.Security.Claims.ClaimsIdentity();
//list.AddClaim(new System.Security.Claims.Claim("editionid", "张三"));//EditionId
//list.AddClaim(new System.Security.Claims.Claim("client_id", token)); //ClientId
//list.AddClaim(new System.Security.Claims.Claim("tenantid", token));//TenantId
//list.AddClaim(new System.Security.Claims.Claim(ClaimTypes.Name, token));//TenantId
//var _guid_userid = Guid.NewGuid().ToString();
//Console.WriteLine(_guid_userid);
//list.AddClaim(new System.Security.Claims.Claim(AbpClaimTypes.UserId, _guid_userid));
//context.HttpContext.User = new System.Security.Claims.ClaimsPrincipal(list); //这里可以做token的安全校验
if (!String.IsNullOrEmpty(token))
{
//if (token.CheckToken())
//{
var back = _appCache.HasRole(_model, _role, token);
if (!back.role)
{
throw new SmartToolException($"{(back.code == 401 ? "当前登录密钥失效,请重新登录" : "没有当前接口的操作权限,请确认")}", $"{back.code}");
}
//}
//else
//{
// throw new SmartToolException("当前密钥信息有误,请登录后重试", "401");
//}
}
else
{
throw new SmartToolException("当前密钥信息有误,请登录后重试", "401");
}
}
base.OnActionExecuting(context);
}
}

注入

在需要使用的地方使用如下方式注入

    [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "add" })]

当然为了省事你也可以使用全局注入,比如

            //全局处理异常信息
context.Services.AddControllers(options =>
{
//访问限制
//options.Filters.Add(typeof(ReferrerAttribute));
//错误统一处理
//options.Filters.Add(typeof(PlanExceptionAttribute));
//统一授权
options.Filters.Add(typeof(RoleAttribute));
});

不过一般不建议全局注入,如果全局注入就变成权限的划分要按照Controller和Action两个部分了,如果使用*做识别,还是有搞头的,

不需要的再通过过滤器AllowAnonymousAttribute标记下,还是可以的!

在PasteTemplate项目中,使用的是按需注入,主要是接口权限的问题,看RoleAttribute可以了解到有2个参数Model和Role

可以这么理解一个是模块,一个是权限,比如会员模块的查看,会员模块的新增!

查看上面信息已经可以知道大概的授权流程了,就是用户访问接口的时候,带上自己的token,

接口处标注model和role,然后代码计算当前token所表示的信息是否包含对应的model和role的权限,有则通过,没有则报403错误!

那么问题就剩下token的生成规则和使用注意问题了!

借鉴jwt或者oauth2.0,个人感觉oauth2.0是更合理的,jwt就有点老赖的感觉,我授权出去了就和我没关系了,每次请求还得附带一大堆东西(权限列表加密后的内容等)

密钥生成

拿PasteSpider的token来说 token的格式大概为1760192342_11923_xoifsdkfwejrkwetjoweirwerwet

从_拆分打开分成三部分1.时间戳 2.当前会员id.3消息加密校验,也可以成为sign

用户登陆后,代码可以获取到当前登陆用户的userid,然后var temptoken=md5/sha/sha256...(timestamp_userid_appsecret);

var token =timestamp_userid_temptoken

这样生成的好处是,在不执行redis查询的时候就可以排除一些加的token的访问

如果对接口的权限授权有区分的,比如get的只做一层校验即可,参考jwt,授权一个密钥使用1个月,那么这个账号下一秒删除了,之前授权出去的还能继续使用直到到期!post等请求对数据有更改的再执行redis的二次确认!这样的做法可以极大的提交相应速度!

其实如果权限不是很多的,可以基于上面的方式参考jwt直接封装到token中也是可以的!消息长度绝对比jwt的短!

密钥作废

如果一个用户被禁用了,只要把它对应的token从redis中删除即可!超过时间戳的,密钥直接作废,其实就是下一次访问的时候服务端检查到密钥过期了,直接返回401

问题一

如何在使用自定义过滤器的同时,使用Abp的base.CurrentUser获取当前登陆用户的信息,这个可以去查看下源码,找到这个base.CurrentUser的具体是如何获取值的就行了,按照他们的关系,在过滤器的时候对对应的值赋值即可!

问题二

如何使用AuthorizeAttribute?有时候人的习惯就是那么奇怪,或者旧项目,只要不启用这个Authorize模块即可,然后随便全局注入一个自己的过滤器,在自己的过滤器里面去找当前是否有AuthorizeAttribute即可实现授权。

问题三

市面上一大堆介绍jwt等的授权,用这个自定义的会不会有并发不足等的问题,这个你得自己研究下代码,看看啥叫瓶颈!!!

PasteSpider之接口的授权实现为什么不采用JWT方式的更多相关文章

  1. 易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码

    易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码        怎么才能获取到外盘期货行情数据API接口呢?不少朋友就会考虑到易盛9.0行情API接口,本身易盛就是一个软件提供商,提供行 ...

  2. OAuth 第三方登录授权码(authorization code)方式的小例子

    假如上面的网站A,可以通过GitHub账号登录: 下面以OAuth其中一种方式,授权码(authorization code)方式为例. 一.第三方登录的原理 所谓第三方登录,实质就是 OAuth 授 ...

  3. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  4. AspNetCore 成长杂记(一):JWT授权鉴权之生成JWT(其二)

    引子 前面说了用第三方类库生成JWT的故事,给我带来了很大的方便,并且我也承诺要写一篇用常规方法生成JWT的文章(一般都是用微软官方的类库),因此才有了这篇文章. 另外,在前面的文章中,我要纠正一下一 ...

  5. ZeroMQ接口函数之 :zmq_curve – 安全的认证方式和保密方式

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_curve zmq_curve(7) ØMQ Manual - ØMQ/4.1.0 Name zmq_curve  ...

  6. php用curl调用接口方法,get和post两种方式

    首先是客户端执行方法ApiModel.php: <?php /** * 模拟post进行url请求 * @param string $url * @param array $post_data ...

  7. 微信公众平台--网页授权获取用户基本信息(snsapi_base方式)

    关于snsapi_base网页授权的说明 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回调 ...

  8. 微信公众平台--网页授权获取用户基本信息(snsapi_userinfo方式)

    关于snsapi_userinfo网页授权的说明 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的.但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注, ...

  9. 使用Callable接口创建线程和使用线程池的方式创建线程

    1.使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 package com.baozi.java2; import java.util.concurrent.Ca ...

  10. wp rest api 授权方法步骤(使用JWT Authentication插件)

    环境:wordpress 4.7 以上,WP自带的 rest api v2 目标:使用javascript与wp rest api交互,其中编辑.新增.删除等需要Oauth认证授权 方法: 步骤一:  ...

随机推荐

  1. 本周四晚19:00知识赋能第七期第3课丨OpenHarmony WiFi扫描仪实现

    8月25日19:00~20:00,第七期知识赋能第三节直播就要开始啦!如果你是缺乏实战经验的学生,如果你是初出茅庐的职场新人,如果你是想参与开源的贡献者,那么本期的直播课将不容错过!通过本期直播,开发 ...

  2. C#中操作Excel

    在GIS数据处理中,经常遇到与Excel的交互,这里进行简单的总结. Excel行列号就像是编辑中的二维数据组,操作Excel相当于操作二维数组.遍历.循环.取值.赋值-- 1.添加引用 添加引用也有 ...

  3. Qt 实现涂鸦板三:实现鼠标绘制矩形

    .h 文件 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" #include " ...

  4. 基于istio实现多集群流量治理

    本文分享自华为云社区<基于istio实现多集群流量治理>,作者: 可以交个朋友. 一 背景 对多云.混合云等异构基础设施的服务治理是Istio重点支持的场景之一.为了提高服务的可用性,避免 ...

  5. 鸿蒙HarmonyOS实战-ArkUI组件(Menu)

    一.Menu组件 Menu组件是一种常见的用户界面(UI)控件,用于在移动应用程序中显示可选项列表.它通常由一系列链接或按钮组成,以帮助用户导航和选择所需的操作.Menu组件可以在水平或垂直方向上呈现 ...

  6. 【直播回顾】Hello HarmonyOS进阶课程第四课——ArkUI动画开发

    5 月 25 日晚上 19 点,由知名HarmonyOS开发领域的up主九弓子主讲的Hello HarmonyOS进阶系列应用篇第四课<ArkUI动画开发>,在众多HarmonyOS社群内 ...

  7. 一文带你详细了解HarmonyOS折叠屏设计规范!

    原文:https://mp.weixin.qq.com/s/G25IbfcX2Bq9s1IDPCELGw,点击链接查看更多技术内容. 随着新一代折叠屏手机HUAWEI Mate Xs 2发布,Harm ...

  8. Python 潮流周刊第 46 期(摘要)+ 赠书 7 本

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  9. 树模型--ID3算法

    基于信息增益(Information Gain)的ID3算法 ID3算法的核心是在数据集上应用信息增益准则来进行特征选择,以此递归的构建决策树,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类. ...

  10. 重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]

    前言 前面写过二分法使用的是递归手法,然后该节才有不递归的方式执行. 二分法的时间复杂度为log(2)n.空间复杂度为:1. 正文 代码: static void Main(string[] args ...