关于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 第三方应用客户端,例如csdn通过QQ登录,csdn就属于QQ应用的客户端

  Authorization Server 授权服务器

 四个角色的关系:Resource Owner在Authorization Server注册Client信息,通过Client去访问Authorization Server拿到token凭  证,通过token凭证去Resource Server获取自己的资源

 

了解上面的内容后就可以开始了项目地址:https://gitee.com/livemetoo/suespringcloud2020

加入依赖

关于spring-cloud-starter-oauth2的研究学习总结

定义授权服务器:sue-springlloud-auth2模块

关于spring-cloud-starter-oauth2的研究学习总结

授权服务器主要有两个配置  AuthorizationServerConfigurerAdapterWebSecurityConfigurerAdapter

  • 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:

关于spring-cloud-starter-oauth2的研究学习总结

关于spring-cloud-starter-oauth2的研究学习总结

关于spring-cloud-starter-oauth2的研究学习总结

WebSecurityConfigurerAdapter:

关于spring-cloud-starter-oauth2的研究学习总结

认证中心也是资源服务器所以在启动类加@EnableResourceServer

关于spring-cloud-starter-oauth2的研究学习总结

最后暴露获取当前用户的地址

关于spring-cloud-starter-oauth2的研究学习总结

重点提用一下AuthorizationServerConfigurerAdapter的配置UserServiceDetail

关于spring-cloud-starter-oauth2的研究学习总结

它完成了当前用户信息的初始化

关于spring-cloud-starter-oauth2的研究学习总结

下面贴出相关代码

关于spring-cloud-starter-oauth2的研究学习总结

sysfeignService的实现:

关于spring-cloud-starter-oauth2的研究学习总结

 

到此授权服务器定义就完成了,接着是上面两个客户端的说明和配置

关于spring-cloud-starter-oauth2的研究学习总结

关于spring-cloud-starter-oauth2的研究学习总结

可以看到我们配置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访问资源服务器了

关于spring-cloud-starter-oauth2的研究学习总结

关于spring-cloud-starter-oauth2的研究学习总结

client_1客户端模式:该模式的客户端通常是系统的某个模块作为客户端访问资源服务器,比如feign调用资源服务器的资源时等,比如

上面的SysFeignService.findByName()访问的就是一个资源服务器,那么该客户端的配置如下

关于spring-cloud-starter-oauth2的研究学习总结

关于spring-cloud-starter-oauth2的研究学习总结

可以看到调用feign时获取到的access_token

关于spring-cloud-starter-oauth2的研究学习总结

说完两个客户端最后来看下资源服务器的配置

关于spring-cloud-starter-oauth2的研究学习总结添加EnableResourceServer注解开启资源服务的功能,加注解EnableGlobalMethodSecurity开户方法级别的保护,ResourceServerConfigurerAdapter是配置类,configure(HttpSecurity http)中只配置了"/sys/**"需要验证

如果要验证权限可以再controller方法上添加@PreAuthorize("hasAnyAuthority('sysUser:list')")注解就可以完成权限的校验了

项目地址:https://gitee.com/livemetoo/suespringcloud2020