关于spring-cloud-starter-oauth2的研究学习总结
先看oauth2的四种模式:
密码模式(resource owner password credentials)
-
使用client_id和client_secret以及用户名密码直接获取秘钥
授权码模式(authorization code)
-
设计了auth code,通过这个code再获取token
-
使用client_id和client_secret换取授权码(code),再通过授权码换取令牌
简化模式(implicit)
这种模式比授权码模式少了code环节,回调url直接携带token
这种模式的使用场景是基于浏览器的应用
这种模式基于安全性考虑,建议把token时效设置短一些
implicit模式(隐式模式)和授权码模式(authorization_code)访问差不多,相比之下,少了一步获取code的步骤,而是直接获取token
客户端模式(client credentials)
-
这种模式直接根据client的id和**即可获取token,无需用户参与
-
这种模式比较合适消费api的后端服务,比如拉取一组用户信息等
再看oauth2四个角色:
Resource Owner 资源拥有者
Resource Server 资源服务器
Client 第三方应用客户端,例如****通过QQ登录,****就属于QQ应用的客户端
Authorization Server 授权服务器
四个角色的关系:Resource Owner在Authorization Server注册Client信息,通过Client去访问Authorization Server拿到token凭 证,通过token凭证去Resource Server获取自己的资源
了解上面的内容后就可以开始了项目地址:https://gitee.com/livemetoo/suespringcloud2020
加入依赖
定义授权服务器:sue-springlloud-auth2模块
授权服务器主要有两个配置 AuthorizationServerConfigurerAdapter和WebSecurityConfigurerAdapter
- AuthorizationServerConfigurerAdapter 类中3个不同的configure方法分别
- configure(ClientDetailsServiceConfigurer clients) 用来配置客户端详情服务(ClientDetailsService),客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息;
- configure(AuthorizationServerEndpointsConfigurer endpoints) 用来配置授权(authorization)以及令牌(token)的访问端点和令牌服务(token services),还有token的存储方式(tokenStore);
- configure(AuthorizationServerSecurityConfigurer security) 用来配置令牌端点(Token Endpoint)的安全约束;
- WebSecurityConfigurerAdapter
- configure(HttpSecurity http) httpSecurity中配置所有请求的安全验证
- 注入Bean AuthenticationManager 用来做验证
- 注入Bean PasswordEncoder
下面贴出两个配置的代码
AuthorizationServerConfigurerAdapter:
WebSecurityConfigurerAdapter:
认证中心也是资源服务器所以在启动类加@EnableResourceServer
最后暴露获取当前用户的地址
重点提用一下AuthorizationServerConfigurerAdapter的配置UserServiceDetail
它完成了当前用户信息的初始化
下面贴出相关代码
sysfeignService的实现:
到此授权服务器定义就完成了,接着是上面两个客户端的说明和配置
可以看到我们配置client_1客户端模式和clien_2密码模式
clien_2密码模式:用户postman作为客户端发送请求:http://localhost:7003/oauth/token?username=user_1&password=123456&grant_type=password&client_id=client_2&client_secret=123456
可获取access_token,之后就可以携带access_token访问资源服务器了
client_1客户端模式:该模式的客户端通常是系统的某个模块作为客户端访问资源服务器,比如feign调用资源服务器的资源时等,比如
上面的SysFeignService.findByName()访问的就是一个资源服务器,那么该客户端的配置如下
可以看到调用feign时获取到的access_token
说完两个客户端最后来看下资源服务器的配置
添加EnableResourceServer注解开启资源服务的功能,加注解EnableGlobalMethodSecurity开户方法级别的保护,ResourceServerConfigurerAdapter是配置类,configure(HttpSecurity http)中只配置了"/sys/**"需要验证
如果要验证权限可以再controller方法上添加@PreAuthorize("hasAnyAuthority('sysUser:list')")注解就可以完成权限的校验了
项目地址:https://gitee.com/livemetoo/suespringcloud2020