最基础的OAuth2服务商
简介
标准的Oauth服务提供商
-
login模块切换至APP依赖
-
部分配置切换
BrowserSecurityConfig
中注入的passwordEncoder
转至security-core项目,否则会报错bean找不到(在配置项中注入即可,本文转移至SecurityPropertiesConfig
配置项config中)
将成功失败处理器拷贝至APP项目中(处理模式不一样,无法抽象到core项目中)
-
实现认证服务器
package com.cong.security.app.authentication; import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; /** * @author single-聪 * @EnableAuthorizationServer注解实现了认证服务器 */ @Configuration @EnableAuthorizationServer public class MyAuthorizationServerConfig { }
授权码模式基本不会使用(自己的项目中用户名密码都有,不需要授权码)
用户名密码模式:
注意请求头中携带Authentication
参数:
此时即使重复调用返回的access_token
也是同一个值,但是有效期在减少。 -
实现资源服务器
package com.cong.security.app.authentication; import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; @Configuration @EnableResourceServer public class MyResourceServerConfig { }
此时拿到token之后在请求头中携带token即可访问服务提供的接口。
Oauth流程解读
绿色代表实体类、蓝色代表接口
解释:
- TokenEndpoint
入口点,可以当成一个controller
,用来处理获取令牌(/oauth/token
)的请求 - ClientDetailsService
类似于UserDetailsService
,用来读取第三方应用的信息,根据client-id
读取相应的ClientDetails
- ClientDetails
封装第三方应用的信息 - TokenRequest
分装请求中其他参数的信息,ClientDetails
会放到TokenRequest
中 - TokenGranter
被TokenRequest
调用,根据请求传上来的grant_type
选择一个实现执行令牌生成的逻辑,会产生OAuth2Request
以及Authentication
- OAuth2Request
相当于ClientDetails
以及TokenRequest
的整合 - Authentication
当前授权用户的信息,根据UserDetailsService
的实现读取出来的信息 - OAuth2Authentication
OAuth2Request
以及Authentication
整合而成,包含哪一个第三方应用请求哪一个用户授权,授权模式是什么,授权请求的参数是什么,OAuth2Authentication
会传给AuthorizationServerTokenServices
接口的实现 - AuthorizationServerTokenServices
认证服务器令牌服务,拿到OAuth2Authentication
所有信息之后,会生成一个OAuth2AccessToken
令牌 - TokenStore
令牌存取 - TokenEnhancer
令牌增强器,可以在令牌中加一些其他的东西 - OAuth2AccessToken
令牌信息