webapi 访问权限_webapi 写文件权限_jeb222222的博客-程序员宅基地

技术标签: webapi  

       最近在做一个项目,前台使用的是angularjs,后台使用的是webapi。webapi不需要登陆,只需要知道方法就能直接访问,这个就比较郁闷了。因为之前也没有做过权限控制的问题,百度搜到了不少,但是都不能用,只能自己解决了,后来终于找到了一种可以实现的方法,只是不知道好不好,希望有人看到能给个答案。实现方法如下:

      1、根据登陆信息(用户名,密码之类的)去数据库查询到用户信息,以及用户所有的权限(权限由在增加用户的时候分配)。

      2、建立FormsAuthenticationTicket,并把用户信息保存到缓存中,并返回登陆结果及一个token(唯一标识),userRole是一个需要返回的信息实体类。

          FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                2,
                list[0].USERID,
                DateTime.Now,
                dateCookieExpires,
                 false,
                new JavaScriptSerializer().Serialize(userRole)-------权限(后面用到)
                );
            string encTicket = FormsAuthentication.Encrypt(ticket);
    HttpRuntime.Cache.Add(userRole.TOKEN, encTicket, null, DateTime.Now.AddDays(7), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Default, null);------------保存到缓存中,也可以存到数据库

            return Json(userRole);

    

      3、把token保存到本地       localStorage.setItem("token",userRole.TOKEN);

      4、创建一个全局注入器,每次访问的时候,可以自动在header中带入token

           

.factory("httpInjector",['$q','$injector',function($q,$injector){
    var httpInterceptor = {
        'responseError' : function(response) {
            // ......
            return $q.reject(response);
        },
        'response' : function(response) {
            if (response.status == 21000) {
                // console.log('do something...');
            }
            return response || $q.when(response);
        },
        'request' : function(config) {
            config.headers = config.headers || {};
            if (localStorage.token) {
                config.headers.token = localStorage.getItem("token");
                // config.headers['X-Access-Token'] = $localStorage.token;
            };

            return config || $q.when(config);

            return config;
        },
        'requestError' : function(config){
            // ......
            return $q.reject(config);
        }
    };
    return httpInterceptor;

}])

5、把注入器配置到config中

.config(["$ionicConfigProvider",'$httpProvider', function ($ionicConfigProvider,$httpProvider) {
    $httpProvider.interceptors.push('httpInjector');
}])

 6、创建一个过滤器TestFilter,继承AuthorizationFilterAttribute,重写方法

         public override void OnAuthorization(HttpActionContext actionContext)-------重写授权方法        {    

        if (HttpContext.Current.Request.Headers["token"] != null)        

    {         

       string token = HttpContext.Current.Request.Headers["token"].ToString();---------获取前台传过来的token                      if (HttpRuntime.Cache.Get(token) != null)

                {

                  ------------根据token到缓存中取出用户信息。

              FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(HttpRuntime.Cache.Get(token).ToString());

                    if (ticket != null)                 

         {                   

     USER_ROLE userRole = new JavaScriptSerializer().Deserialize<USER_ROLE>(ticket.UserData);           

             string[] roles = new string[] { };--------取出用户权限组成数据                

        IIdentity identity = new FormsIdentity(ticket);-------------标识用户的身份验证的类型              

          IPrincipal principal = new GenericPrincipal(identity, roles); ---------当前用户标识                        HttpContext.Current.User = principal;-----------  为当前 HTTP 请求设置安全信息。                    

                    }           

                }       

             }

        }

     7、把自定义的过滤器注册到webapiconfig中,注册后每次webapi请求会先经过过滤器

             config.Filters.Add(new TestFilter());

8、方法或控制器上添加权限限制   [Authorize(Roles = "TEST")]

到此完成,没有此权限的用户就无法访问此方法。

为什么要返回token到前台,然后把用户信息保存到缓存中呢?是因为对于webapi来说,每次的访问都是一个新的请求,

之前的登陆信息在下次访问的时候就请求不到了,cookie和session也访问不到,所以信息保存到了缓存中(保存到数据库也可以

但是请求太频繁)。根据token,找到对应的用户信息,取出用户信息后赋给当前请求用户,当前用户才有访问权限。

   

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jeb222222/article/details/80581331

智能推荐

Qt音乐播放器[1]-介绍_Qt君的博客-程序员宅基地

基于Qt写的音乐播放器,主要功能有添加音乐,上一曲,下一曲,暂停/播放,拖动快进,歌词滚动显示。 主界面 主界面是经典的音乐播放器布局,顶栏音乐标题,中栏是歌词显示和底栏的音乐控制。 功能栏 左边按钮是音乐列表,中间按钮是播放模式选择(单曲播放,循环播放,随机播放),右边按钮是增加音乐的功能(只需增加音乐的路径即可,软件自动找到音乐文件)。 ...

OpenCV图像特征提取与检测C++(五)特征描述子--Brute-Force匹配、FLANN特征匹配、平面对象识别、AKAZE局部特征检测与匹配、BRISK特征检测与匹配、ORB特征提检测与匹配_opencv图像特征提取与识别_gsx316的博客-程序员宅基地

特征描述子 即图像中每个像素位置的描述,通过此描述去匹配另一张图像是否含有相同特征。 暴力匹配:Brute-Force 图像匹配本质上是特征匹配。因为我们总可以将图像表示成多个特征向量的组成,因此如果两 幅图片具有相同的特征向量越多,则可以认为两幅图片的相似程度越高。而特征向量的相似程度通常是用它们之间的欧氏距离来衡量,欧式距离越小,则可以认为越相似。 代码:#include &amp;amp;amp;lt..._opencv图像特征提取与识别

165体重_女生155-165cm标准体重是多少?若你“达标”了,那么恭喜你_weixin_39813574的博客-程序员宅基地

导语:不管是任何时候,女人爱美的心情都是很相似的,她们对于自己的身高,面部护理以及服装等都是格外关注的。一些女性朋友吃东西时也生怕会长胖,其实按照健康身体来说,身高和体重是有一定比例的。那么身高155-165的女生的标准体重是多少呢?很多胖胖的女孩子无论是在生活中还是在工作中都能够深刻地体会到这个社会对于胖子的恶意,因为身材较胖,不仅穿不上好看的衣服,还找不到男朋友,即便是在工作面试中也会被认为是..._钟欣桐体重多少

php sdk 支付宝支付接口商户公钥、应用公钥、商户私钥的使用说明-by勤勤学长 2018年4月_qq318692996的博客-程序员宅基地

被折腾了一个小时左右。终于理清了,先前已经解决了,但是没有做笔记,不记得了又得重新捋一遍。APPID中的数字要 开放平台密钥中的app_iapp_id放这里然后下载支付宝密钥生成器 https://docs.open.alipay.com/291/105971生成设置应用公钥 https://openhome.alipay.com/platform/keyManage.htm保存成功后,就可以查看...

进阶-第47__深入聚合数据分析_cardinality算法之优化内存开销以及HLL算法_precision_threshold_两点一刻的博客-程序员宅基地

Cardinality 实际上就是做count(distinct)但是cardinality有5%的错误率,但是性能在100ms左右1、precision_threshold优化准确率和内存开销GET /tvs/sales/_search{ "size" : 0, "aggs" : { "distinct_brand" : {..._precision_threshold

Android开发中对读写SD的处理_qyl10241024的博客-程序员宅基地

Android开发中对读写SD的处理众所周知,Android4.0以后的版本的sd卡有了内外之分。在2.x的版本中,在manifest中配置的权限android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。而在4.0开发的源码当中,由于有了内外置sd卡的区分,android.permission.WRITE_EXTERNAL_STORAG

随便推点

LSM9DS1对I2C总线寻址不应答的问题_i2c写入数据后未改变_爱吃不胖的单凡呀的博客-程序员宅基地

记录调试CC3235S的I2C通信时遇到的一些问题_i2c写入数据后未改变

后台信息管理页面模板-内容修改(开发前准备工作)_星空7.4程序单模板的修改_小码哥呀的博客-程序员宅基地

这里写目录标题1、修改项目名称2、修改package.json3、如果需要修改端口号4、项目的目录结构5、运行项目6、登录页修改6.1、修改文件:\src\store\modules\user.js6.1修改\src\util\request.js7、页面零星修改7.1、标题7.2、 国际化设置7.3、 导航栏文字7.4、 面包屑文字7.5、 关闭校验7.6、 复制icon图标7、路由分析7.1、 入口文件中调用路由7.2、 路由模块中定义路由1、修改项目名称解压vue-admin-template-m_星空7.4程序单模板的修改

并发编程基础、同步容器、线程池_吕程Lyu的博客-程序员宅基地

文章目录基础关键字synchronizedvolatile相关类AtomicXXXCountDownLatchReentrantLockThreadLocal实例1 监听容器数量2 生产者 消费者同步容器Map/SetConcurrentHashMap/ConcurrentHshSetConcurrentSkipListMap/ConcurrentSkipListSetListCopyOnWrit...

青藤 #10021 均分纸牌_3sFener的博客-程序员宅基地

题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。  移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1的堆上;其他堆上取的纸 牌,可以移到相邻左边或右边的堆上。   现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如N=4,4 堆纸牌数分别为:① 9 ② 8 ③ 17 ④ 6  移动3次可达到目的:  从 ③ 取 4 张

YOLOV5代码解析(小白系列一)_opt.evolve_MC.zeeyoung的博客-程序员宅基地

yolov5 代码脚本解析1. train.py因为本人太菜了,所以此处就通过一行行debug,然后先记录整个运行逻辑,然后后面再一点点增补每个trick的原理。def main(opt): setlogging(RANK) if RANK in [-1,0]: print(colorstr('train: ')+', '.join(f'{k}={v}' for k,v in vars(opt).items())) check_git_status() check_requiremen_opt.evolve

推荐文章

热门文章

相关标签