Security+Oauth2权限认证(案例 源码)

1.1 Oauth2认证流程:

在这里插入图片描述

1.2 Token携带相关参数注释:

首先讲下资源与授权服务配置注解:
请求优先@EnableAuthorizationServer,@EnableResourceServer处理,剩下的无法匹配的由SpringSecurity处理
在这里插入图片描述

2.1资源服务器配置:

在这里插入图片描述

2.2其他属性:

accessDeniedHandler 授权失败且主叫方已要求特定的内容类型响应
resourceTokenServices加载 OAuth2Authentication 和 OAuth2AccessToken 的接口eventPublisher 事件发布-订阅 根据异常的clazz触发不同event

2.2 授权服务器配置(两种方式):

A.手动:
在这里插入图片描述
B.直接用数据库:
在这里插入图片描述

2.3 配置授权服务器端点,如:令牌存储;令牌自定义;用户批准和授权类型 以及配置服务器端点的安全

在这里插入图片描述

2.4 yml配置例子(以github作为认证服务器):

在这里插入图片描述

2.5 引入依赖

在这里插入图片描述

授权有授权码模式;隐式授权模式;密码模式;客户端模式;常用授权码和密码,介绍如下:

3.1 授权码模式:

在这里插入图片描述
参数列表如下:
client_id:客户端id,和授权配置类中设置的客户端id一致。
response_type:授权码模式固定为code
scop:客户端范围,和授权配置类中设置的scop一致。
redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。
拿到授权码后申请令牌:
在这里插入图片描述
在这里插入图片描述
参数解释:
Access_token:访问令牌,客户端拿着访问令牌即可向服务提供方获取相应资源或信息
Refresh_token:刷新令牌,由于访问令牌是有失效时间的,所以一般情况下都是在访问令牌即将失效时使用刷新令牌可重新获取新的访问令牌
token_type:有MAC Token与Bearer Token两种类型,两种的校验算法不同,RFC 6750建议Oauth2采用 Bearer Token(http://www.rfcreader.com/#rfc6750)。
expires_in:过期时间,单位为秒。
scope:范围,与定义的客户端范围一致。

3.2 资源服务器授权配置:

1 配置公钥:
在这里插入图片描述
3 在config包下创建ResourceServerConfig类
4 资源服务器测试是否携带令牌以及令牌是否有效:
在这里插入图片描述
注:若不携带令牌或令牌过期或错误则无法验证一般报如下错误:
在这里插入图片描述
在这里插入图片描述

3.3 密码模式:(相对授权码而言少了一步授权码获取 由用户直接将用户名密码传给客户端 客户端直接拿着这两个去申请令牌)

在这里插入图片描述
参数:
grant_type:密码模式授权填写password
username:账号
password:密码
在这里插入图片描述
上边参数使用x-www-form-urlencoded方式传输,使用postman测试如下:
在这里插入图片描述
参数:
client_id:客户端准入标识。
client_secret:客户端秘钥。
grant_type:授权类型,填写password表示密码模式
username:资源拥有者用户名。
password:资源拥有者密码

注意:当令牌没有过期时同一个用户再次申请令牌则不再颁发新令牌。
校验令牌:
在这里插入图片描述
校验成功则会返回与该令牌绑定的相关用户信息
参数列表:
exp:过期时间,long类型,距离1970年的秒数(new Date().getTime()可得到当前时间距离1970年的毫秒数)。
user_name: 用户名
client_id:客户端Id,在oauth_client_details中配置
scope:客户端范围,在oauth_client_details表中配置
jti:与令牌对应的唯一标识
companyId、userpic、name、utype、id:这些字段是本认证服务在Spring Security基础上扩展的用户身份信息
刷新令牌的使用:
在这里插入图片描述
生成一个新的访问令牌
grant_type : 固定为 refresh_token
refresh_token:刷新令牌(注意不是access_token,而是refresh_token)
注:刷新令牌成功,会重新生成新的访问令牌和刷新令牌,令牌的有效期也比旧令牌长。
刷新令牌通常是在令牌快过期时进行刷新。
Xml配置:
在这里插入图片描述

3.4 WebSecurityConfig中HttpSecurity一些参数解释:

在这里插入图片描述

3.5 Jwt令牌:

jwt与token的验证思路区别:

Token:后端接收到前端传过来的token,若果是通过数据库或redis或session进行对比验证,这种方式为令牌验证

  1. 用户输入用户名和密码,发送给服务器。
  2. 服务器验证用户名和密码,正确的话就返回一个签名过的token(token 可以认为就是个长长的字符串),浏览器客户端拿到这个token。
  3. 后续每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效,如果有效那么认证就成功,可以返回客户端需要的数据。 特点: 这种方式的特点就是客户端的token中自己保留有大量信息,服务器没有存储这些信息。
    Jwt:后端接收到前端传过来的token,如果是通过一套加密解密算法(RSA)来确定用户的身份是否合法,这种方式为jwt(Header头部(令牌的类型(即JWT)及使用的哈希算法(如HMACSHA256或RSA)),Payload负载(内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比如:iss(签发者),exp(过期时间戳),sub(面向的用户)等,也可自定义字段。此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分)和Signature签名(用于防止jwt令牌被篡改)。由三部分生成token,三部分之间用“.”号做分割)
    2 生成公钥和私钥:
    在这里插入图片描述
    参数解释:
    Keytool是一个java提供的证书管理工具
    -alias:密钥的别名
    -keyalg:使用的hash算法
    -keypass:密钥的访问密码
    -keystore:密钥库文件名,
    xc.keystore保存了生成的证书
    -storepass密钥库的访问密码
    查询证书信息:
    Keytool -list -keystore wang.keystore
    删除别名:
    Keytool -delete -alias xckey -keystore wang.keystore
    3 导出公钥:
    需要先下载openssl(加解密工具包):http://slproweb.com/products/Win32OpenSSL.html并配置对应的环境变量
    4 cmd进入wang.keystore所在目录执行:
    keytool -list -rfc --keystore wang.keystore | openssl x509 -inform pem -pubkey
    在这里插入图片描述
    上半部即为公钥 将其放到编辑器 调整为一行
    生成jwt令牌:
    在这里插入图片描述
    在这里插入图片描述
    校验令牌:
    在这里插入图片描述
    结果:
    在这里插入图片描述
    若令牌校验正确,则可看到与令牌绑定的相关信息数据
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白大锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值