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

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

1.1 Oauth2认证流程:

20210625144352809.png

1.2 Token携带相关参数注释:


首先讲下资源与授权服务配置注解:


请求优先@EnableAuthorizationServer,@EnableResourceServer处理,剩下的无法匹配的由SpringSecurity处理


20210625144433867.png


2.1资源服务器配置:

20210625144458855.png


2.2其他属性:


accessDeniedHandler 授权失败且主叫方已要求特定的内容类型响应


resourceTokenServices加载 OAuth2Authentication 和 OAuth2AccessToken 的接口

eventPublisher 事件发布-订阅 根据异常的clazz触发不同event


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


A.手动:


20210625144543661.png

B.直接用数据库:

20210625144559962.png


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


20210625144649304.png


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


2021062514470931.png


2.5 引入依赖


20210625144728531.png

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


3.1 授权码模式:


20210625144758307.png

参数列表如下:


client_id:客户端id,和授权配置类中设置的客户端id一致。


response_type:授权码模式固定为code


scop:客户端范围,和授权配置类中设置的scop一致。


redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。


拿到授权码后申请令牌:


20210625144813178.png

20210625144819881.png


参数解释:


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 配置公钥:


20210625144856808.png


3 在config包下创建ResourceServerConfig类


4 资源服务器测试是否携带令牌以及令牌是否有效:


20210625144911782.png


注:若不携带令牌或令牌过期或错误则无法验证一般报如下错误:


20210625144923997.png

20210625144929881.png

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

20210625145012452.png


参数:


grant_type:密码模式授权填写password


username:账号


password:密码


20210625145025343.png


上边参数使用x-www-form-urlencoded方式传输,使用postman测试如下:

20210625145035888.png


参数:


client_id:客户端准入标识。

client_secret:客户端秘钥。

grant_type:授权类型,填写password表示密码模式

username:资源拥有者用户名。

password:资源拥有者密码


注意:当令牌没有过期时同一个用户再次申请令牌则不再颁发新令牌。


校验令牌:


20210625145056592.png


校验成功则会返回与该令牌绑定的相关用户信息


参数列表:


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基础上扩展的用户身份信息


刷新令牌的使用

20210625145109525.png


生成一个新的访问令牌


grant_type : 固定为 refresh_token


refresh_token:刷新令牌(注意不是access_token,而是refresh_token)


注:刷新令牌成功,会重新生成新的访问令牌和刷新令牌,令牌的有效期也比旧令牌长。

刷新令牌通常是在令牌快过期时进行刷新。


Xml配置:


20210625145121616.png

3.4 WebSecurityConfig中HttpSecurity一些参数解释:

20210625145132969.png

3.5 Jwt令牌:


jwt与token的验证思路区别:


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


用户输入用户名和密码,发送给服务器。


服务器验证用户名和密码,正确的话就返回一个签名过的token(token 可以认为就是个长长的字符串),浏览器客户端拿到这个token。


后续每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效,如果有效那么认证就成功,可以返回客户端需要的数据。 特点: 这种方式的特点就是客户端的token中自己保留有大量信息,服务器没有存储这些信息。


Jwt:后端接收到前端传过来的token,如果是通过一套加密解密算法(RSA)来确定用户的身份是否合法,这种方式为jwt(Header头部(令牌的类型(即JWT)及使用的哈希算法(如HMACSHA256或RSA)),Payload负载(内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比如:iss(签发者),exp(过期时间戳),sub(面向的用户)等,也可自定义字段。此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分)和Signature签名(用于防止jwt令牌被篡改)。由三部分生成token,三部分之间用“.”号做分割)


2 生成公钥和私钥:


20210625145322643.png


参数解释:


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


20210625145408747.png


上半部即为公钥 将其放到编辑器 调整为一行


生成jwt令牌:


20210625145420604.png

2021062514542620.png


校验令牌:


20210625145435493.png


结果:


20210625145446390.png



目录
相关文章
|
7月前
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
242 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
7月前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
579 0
|
存储 安全 Java
Spring Security 认证的三种方式及简单的授权
Spring Security 认证的三种方式及简单的授权
122 0
|
8月前
|
安全 Java API
深度解析 Spring Security:身份验证、授权、OAuth2 和 JWT 身份验证的完整指南
Spring Security 是一个用于保护基于 Java 的应用程序的框架。它是一个功能强大且高度可定制的身份验证和访问控制框架,可以轻松地集成到各种应用程序中,包括 Web 应用程序和 RESTful Web 服务。 Spring Security 提供了全面的安全解决方案,用于身份验证和授权,并且可以用于在 Web 和方法级别上保护应用程序。
949 0
|
安全 NoSQL Java
Spring Security认证与授权框架
Spring Security认证与授权框架
103 1
|
缓存 安全 NoSQL
SpringBoot 如何使用 Sa-Token 完成权限认证?
SpringBoot 如何使用 Sa-Token 完成权限认证?
354 0
|
安全 前端开发 Java
Spring Security5+ 用户认证、授权及注销
Spring Security5+ 用户认证、授权及注销
296 0
Spring-security-oauth2 源码分析 登陆流程 /oauth/check_token (二)
Spring-security-oauth2 源码分析 登陆流程 /oauth/check_token (二)
Spring-security-oauth2 源码分析 登陆流程 /oauth/check_token (二)
Spring-security-oauth2 源码分析 登陆流程 /oauth/token (一)
Spring-security-oauth2 源码分析 登陆流程 /oauth/token (一)
Spring-security-oauth2 源码分析 登陆流程 /oauth/token (一)
|
安全 前端开发 Java
【Spring专题】「开发实战」Spring Security与JWT实现权限管控以及登录认证指南
【Spring专题】「开发实战」Spring Security与JWT实现权限管控以及登录认证指南
339 0
【Spring专题】「开发实战」Spring Security与JWT实现权限管控以及登录认证指南