• 关于权限控制jwt+security+shiro


    1、GrantedAuthority:https://www.cnblogs.com/longfurcat/p/9417422.html
    https://www.cnblogs.com/longfurcat/p/9417422.html

    一、JWT(Java Web Token)

    什么是JWT?
    JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全的传输信息,该信息可以被验证和信任,因为它是数字签名的。
    1.1、跨域身份验证
    传统验证方式,Internet服务无法与用户身份验证直接分开。
    1.用户向服务器发送用户名和密码
    2.验证服务器之后,相关数据(用户角色、权限、登录时间)将保存在当前会话中。
    3.服务器向用户返回session_id,session信息都会写入用户的Cookie。
    4.用户的每个后续请求都将通过Cookie中取出session_id传给服务器。
    5.服务器接收到session_id并对比之前保存的数据,确认用户的身份。

    缺点:没有分布式架构,无法横向拓展
    如果使用一个服务器,该模式没有问题,但是如果它是服务器集群或者面向服务的跨体系结构的话,则需要一个统一的session数据库来保存会话实现数据共享。(此处有一个面试题:如何实现session共享?https://zhuanlan.zhihu.com/p/152224669)这样负载均衡下每个服务器才可以正确的验证用户的身份。

    诸如单点登录的例子:站点A和站点B提供同一个公司的相关服务,现在要求用户登录其中一个网站,然后它就会自动登录到另外一个网站。如何做?
    (1)持久化session数据,写入数据库或者文件持久层等,收到请求后,验证服务从持久层请求数据。该解决方案的优点在于架构清晰,而缺点是架构修改成本较大,整个服务的验证逻辑需要重写,工作量相对较大。而且由于依赖持久层的数据库或者文件系统也会有单点风险,如果持久层失败,整个认证体系就会陷入瘫痪。
    (2)JWT,通过客户端保存数据,而服务器根本不保存会话数据,每个请求都会被发送回服务器。
    1.2、JWT原则
    就是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户。

    {
    	"UserName":"kiki",
    	"Role":"admin",
    	"Expire":"2020-07-31 09:11:59"
    }
    

    当用户和服务器通信时,客户在请求中发回JSON对象。服务器仅依赖于这个JSON对象来标识用户。为了防止用户篡改数据,服务器将在成对象时,添加签名。服务器不会保存任何会话数据,即服务器变为无状态,从而使其更容易扩展。

    二、JWT的数据结构

    JWT分为三部分:JWT头、有效载荷、签名==
    在这里插入图片描述
    在这里插入图片描述

    2.1、JWT头
    jwt头部分是一个描述JWT元数据的JSON对象。

    {
    	"alg":"HS256",
    	"typ":"JWT"
    }
    

    alg属性表示签名使用的算法,默认为HMAC SHA256(HS256)
    typ属性表示令牌的类型,JWT令牌统一写为JWT
    使用Base64URL算法将上述JSON对象转换为字符串保存。
    2.2、有效载荷
    有效载荷是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据,JWT指定七个默认字段供选择。
    iss:发行人
    exp:到期时间
    sub:主题
    aud:用户
    nbf:在此之前不可用
    iat:发布时间
    jti:JWT ID 用于标识该JWT
    除了以上默认字段,我们还可以自定义私有字段,eg:

    {
    	"sub":"kiki的主题",
    	"username":"kiki_zhang",
    	"admin":true
    }
    

    注意:JWT默认情况下是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,防止信息泄露。
    2.3、签名哈希
    签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
    首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开,然后,使用标记头指定的签名算法(默认HS256)根据以下公式生成签名:

    HMACSHA256(base64UrlEncode(header) + "_" + base64UrlEncode(payload),secret)
    

    在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组成一个字符串,每个部分以"."分隔,就构成整个JWT对象。

    2.4、BaseURL算法
    如上所述,JWT头和有效载荷序列化的算法都用到了Base64URL。
    作为令牌的JWT可以放在URL中(eg:api.example/?token=xxx)。Base64中用的三个字符是"+","/“和”="
    由于在URL中有特殊含义,因此Base64URL中对他们做了替换:
    “=“去掉,”+“用”-“替换,”/“用”_” 替换。这就是Base64URL算法。

    3、JWT的用法

    3.1、客户端接收服务器返回的JWT,将其存储在Cookie或者localStorage中。
    伺候,客户端将在与服务器交互的过程中都会带JWT,如果将它存储在Cookie中就会自动发送,但是不会跨域,因此一般将它放在HTTP请求的Header Authorization字段中
    Authorization Bear
    当跨域时,也可以将JWT被放置于POST请求的数据主体之中。
    3.2JWT的使用场景?
    Authorization(授权): 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
    Information Exchange(信息交换): 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

    4、JWT问题和趋势

    1.JWT默认不加密,但可以加密,生成原始令牌后,可以使用改令牌再次对其进行加密
    2.当JWT未加密方法时,一些私密数据无法通过JWT传输。
    3.JWT不仅可以用于认证还可以用于信息交换。善用JWT有助于减少服务器请求数据库的次数
    4.JWT最大缺点是服务器不会保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。
    5.JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置的太长,对于某些重要的操作,用户在使用时应该每次都进行身份验证。
    6.为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS来进行传输。
    提供参考:https://blog.csdn.net/weixin_42873937/article/details/82460997
    https://zhuanlan.zhihu.com/p/121630884

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/kiki-study/p/13656096.html
Copyright © 2020-2023  润新知