老大说要拥抱开源才能进步,所以抛砖引玉,欢迎评论和指教
基础知识:
我眼中的oauth2:
oauth2四个基本角色:
1.Resource Owner: 资源的拥有者(个人理解使用client的人或。。。)
2.Client:某一个具体的应用或app等等
3.Authorization Server:授权中心服务(根据代码调试主要功能为:认证用户、认证client、询问用户-Resource Owner给client授权)
4.Resource Server: 个人理解可能有偏差,谨慎!括号内为个人理解(client为一个套壳服务,真实的服务内容由Resource Server提供,所以需要使用accessToken去让resource server校验相关授权等是否足够)
上述内容可能有误,如果有误请留言指正,oauth2的详细文档如下:
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2
Springboot Oauth 的流程:
整合过程简介及相关处理:
主要参考文档:
https://docs.spring.io/spring-security/site/docs/current/reference/html5/
实现功能:
使用authorization server注册及校验client,完成authorization_code方式认证用户及授权,使用accesstoken换取用户信息
主要代码版本信息:
springboot: 2.5.2
spring-security-oauth2: 2.4.1.RELEASE
关键点:
针对于authorization server:
1) 用户认证(针对resource owner)和授权操作,都是在authorization server服务的页面中操作和完成,认证后签发authentication_code,client拿到code后携带scope询问是否进行授权,authorization server在收到用户页面操作的授权后,将成功授权的内容用access token存储并返回给client端,供client之后使用(认证和授权都在authentication server中操作可以使用户的认证信息和授权信息都可以从内存中方便的获取)
2) 使用@EnableAuthorizationServer注解开启配置,该注解会import两个核心配置文件,AuthorizationServerEndpointsConfiguration以及AuthorizationServerSecurityConfiguration,这两个配置文件会引入包括TokenEnpoint及AuthorizationEndpoint()在内的默认核心入口(eg:/oauth/authorize ; /oauth/token)
3) 两个配置修改的核心配置类,WebSecurityConfigAdapter以及AuthorizationServerConfigurerAdapter
WebSecurityConfigAdapter这个配置文件的主要作用是做用户认证,普通的spring security项目的也会使用,用来配置用户(resource owner)认证的拦截器链(以下称呼为authentication链)
AuthorizationServerConfigurerAdapter用来做client认证链的配置(下文称呼为authorization链)
这两个配置文件内容,会让spring创建两个SecurityFilterChain,并注入到DelegatingFilterProxyRegistrationBean中(请求进入的security处理流程的Filter)
authentication链有两个需要关注的核心Filter,UsernamePasswordFilter,FilterSecurityInterceptor(UsernamePasswordFilter的功能:解析获取请求中的username,password并进行相关认证)
authorization链的两个需要关注的核心Filter为,BasicAuthenticationFilter,FilterSecurityInterceptor(BasicAuthenticationFilter的主要功能:获取header中的authentication信息,将加密后的信息解密,并校验client加密的信息和当前注册的client信息是否一致)
FilterSecurityInterceptor主要功能是确认当前请求中的用户是否已经通过认证,如果已经通过认证则继续执行,如果未通过认证那么进行相关拦截处理,譬如返回403页面等
针对于client:
1)主要配置文件为WebSecurityConfigurerAdapter,在配置中使用oauth2Login()和oauth2Client()来开启拦截和登录操作
oauth2Client()主要用来注册当前的client信息,oauth2Login()用来拦截用户使用oauth2方式登录
2)关键类SecurityContextHolder,使用这个类,可以通过getContext().getAuthentication()获取实际用户信息
针对于resource server:
未配置和使用,可能的核心配置为@EnableResourceServer,等之后有时间再调研一下
最后代码Demo地址:
https://github.com/owisho/usercenter