> 本博文翻译自[官方文档](https://projects.spring.io/spring-security-oauth/docs/oauth2.html)。
Spring Security 官方已经弃用OAuth2项目了,你知道吗?Spring Security5.2.x版本以上提供了最新的方式。
## 一、关于授权服务器
### AuthorizationServerConfigurer的配置
使用注解`@EnableAuthorizationServer`启用授权服务器。授权服务器可以对ClientDetailsService、AuthorizationServerSecurity、AuthorizationServerEndpoints进行配置。
分别对应三个配置类:
- ClientDetailsServiceConfigurer: a configurer that defines the client details service. Client details can be initialized, or you can just refer to an existing store.
- `AuthorizationServerSecurityConfigurer`: tolen获取的安全性设置。
- `AuthorizationServerEndpointsConfigurer`: 定义了授权、token获取的相关服务。
### 配置Client Details
`ClientDetailsServiceConfigurer`会被`AuthorizationServerConfigurer`回调。Client Details Service可以被设置为基于内存或者是JDBC的实现,关键属性包括:
- clientId: (非空)Client编号.
- secret: client secret.
- scope: 客户端访问范围限制。如果scope设置为空,则不进行限制。
- authorizedGrantTypes: Grant types that are authorized for the client to use. Default value is empty.
- authorities: Authorities that are granted to the client (regular Spring Security authorities).
### 管理token
`AuthorizationServerTokenServices`用来管理token存储的实现,默认存储是在内存中的。
- InMemoryTokenStore:适合单节点开发环境;
- JdbcTokenStore :各个服务之间可以共享token存储;
- JWTTokenStore:
### 配置EndPoint URLS
> 什么是EndPoint URLS?作为小白的我,经常感到水土不服。
框架自带的路径:
- `/oauth/authorize`:认证地址;
- `/oauth/token`:token地址;
- `/oauth/confirm_access`:用户授权的时候打开的地址;
- `/oauth/error`:授权错误时打开的地址;
- `/oauth/check_token`:资源服务器解密验证token;
- `/oauth/token_key`:使用JWT token时暴露公有key进行token验证;
## 二、资源(Resource)服务器配置
资源服务器是基于token保护资源服务的。Spring Oauth协议提供Security认证Filter(`OAuth2AuthenticationProcessingFilter`的实现)来实现这个功能。
开启方法:在配置类中添加注解:`@EnableResourceServer`。可用配置有:
- tokenServices: 定义token services的一个bean (ResourceServerTokenServices的实例).
- resourceId: 资源id (可选,但建议使用,如果存在auth服务,将由auth服务器验证).
- other extension points for the resourecs server (e.g. tokenExtractor for extracting the tokens from incoming requests)
- request matchers for protected resources (defaults to all)
- access rules for protected resources (defaults to plain "authenticated")
- other customizations for the protected resources permitted by the HttpSecurity configurer in Spring Security
## 三、OAuth2.0 Client
> 基本概念:
- `OAuth2ProtectedResourceDetails`:被保护的资源bean;
### 被保护资源配置
- `id`: 资源的ID。客户端可以用来查找资源;这个ID在OAuth protocol中是无用的,它也用作bean的ID。
- `clientId`: OAuth client的id. This is the id by which the OAuth provider identifies your client.
- `clientSecret`: The secret associated with the resource. By default, no secret is empty.
- `accessTokenUri`: The URI of the provider OAuth endpoint that provides the access token.
- `scope`: 多个scope之间使用','连接的字符串配置,可以访问资源资源。默认不指定任何的scope。
- `clientAuthenticationScheme`: The scheme used by your client to authenticate to the access token endpoint. Suggested values: "http_basic" and "form". Default: "http_basic". See section 2.1 of the OAuth 2 spec.
> Different grant types have different concrete implementations of OAuth2ProtectedResourceDetails (e.g. ClientCredentialsResource for "client_credentials" grant type). For grant types that require user authorization there is a further property:
- `userAuthorizationUri`: The uri to which the user will be redirected if the user is ever needed to authorize access to the resource. Note that this is not always required, depending on which OAuth 2 profiles are supported.
### 客户端的配置
使用注解:`@EnableOAuth2Client`,注解的背后做了两件事情:
- 创建了一个ID为`oauth2ClientContextFilter`的filter,用来存储当前请求和上下文。在认证请求过程中用于管理OAuth认证url的重定向。
- 请求过程中,创建了一个类型为`AccessTokenRequest`的bean,授权码可以用这个bean来防止客户端与单个用户的状态冲突。
`AccessTokenRequest`在OAuth2RestTemplate是这样的使用的:
```java
@Autowired
private OAuth2ClientContext oauth2Context;
@Bean
public OAuth2RestTemplate sparklrRestTemplate() {
return new OAuth2RestTemplate(sparklr(), oauth2Context);
}
```
### 资源访问
在Spring3中RestTemplate是访问资源时推荐的方式,Spring Security对其进行了拓展,只需要实例化`OAuth2ProtectedResourceDetails`就好了。
### 客户端token的保持
客户端不需要持久化token,但是客户端重启时用户不需要获取一个新的token。 `ClientTokenServices` 接口定义了必要的功能用来持久化 OAuth 2.0 tokens以区分用户。系统提供了一种JDBC的实现。想要使用这个特性,需要向OAUthRestTemplate提供额外的`TokenProvider`配置。
```java
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
public OAuth2RestOperations restTemplate() {
OAuth2RestTemplate template = new OAuth2RestTemplate(resource(), new DefaultOAuth2ClientContext(accessTokenRequest));
AccessTokenProviderChain provider = new AccessTokenProviderChain(Arrays.asList(new AuthorizationCodeAccessTokenProvider()));
provider.setClientTokenServices(clientTokenServices());
return template;
}
```
## 感慨一下
> 之前在网络上搜了不少关于Spring Security Oauth2相关的资料,理解一直不甚透彻。今日官网文档一看,发现Spring Security Oauth2已经是Spring4.x时代的产物了。说明自己学习新知识的习惯还是不太成熟。另外说一点,看英文文档的表述比谷歌的自动翻译要好太多了。
- 简介
- 更新说明
- 其他作品
- 第一部分 Java框架基础
- 第一章 Java基础
- 多线程实战
- 尝试一下Guava带返回值的多线程处理类ListenableFuture
- LocalDate和Date有什么区别
- JAVA8接口增强实践
- 第二章 Spring框架基础
- MVC究竟是个啥?
- @ApiImplicitParam
- 七种方式,教你在SpringBoot初始化时搞点事情!
- Spring事务状态
- maven
- Mybatis小总结
- mybatis-plus的使用
- 第三章 SpringSecurity实战
- 基于SpringSecurity+jwt的用户认证
- spring-security-oauth2
- 第四章 数据库
- mysql
- mysql授权
- mysql数据库三个关键性能指标--TPS\QPS\IOPS
- 梳理一下那些年Mysql的弱语法可能会踩的坑
- 关于Mysql的“字符串”数值的转换和使用
- 凭这一文咱把事务讲透
- Mysql性能优化
- 查询性能优化
- 不常用的一些语法
- elasticsearch
- elasticsearch文档操作
- 索引的基本操作
- java操作ElaticSearch
- elasticsearch中的各种查询
- DB与ES混合应用可能存在的问题及解决方案探索
- 使用es必须要知道的一些知识点:索引篇
- Es中的日期操作
- MongoDB
- 入门篇(了解非关系型数据库 NoSQL - MongoDB)
- 集群分片 (高级篇)
- 互联网大厂的建表规范
- 第五章 中间件
- nginx
- nginx动静分离配置,这个雷你踩过吗?
- Canal
- Sharding-jdbc
- 水平分库实践
- kafka
- 第六章 版本管理
- git
- Not currently on any branch 情况提交版本
- 第七章 IO编程
- 第八章 JVM实战调优
- jvisualvm
- jstat
- 第二部分 高级项目实战篇
- 第一章 微信开发实战
- 第二章 文件处理
- 使用EasyExcel处理导入导出
- 第三章 踩坑指南
- 邮件发送功能
- 第三部分 架构实战篇
- 第一章 架构实战原则
- 接口防止重复调用的一种方案
- 第二章 高并发缓存一致性管理办法
- 第三章 异地多活场景下的数据同步之道
- 第四章 用户体系
- 集成登录
- auth-sso的管理
- 第五章 分库分表场景
- 第六章 秒杀与高并发
- 秒杀场景
- 第七章 业务中台
- 中台的使用效果是怎样的?
- 通用黑白名单方案
- 第八章 领域驱动设计
- 第十一章 微服务实战
- Nacos多环境管理之道
- logback日志双写问题及Springboot项目正确的启动方式
- 第四部分 优雅的代码
- java中的链式编程
- 面向对象
- 开发原则
- Stream操作案例分享
- 注重性能的代码
- 第五部分 谈谈成长
- 新手入门指北
- 不可不知的调试技巧
- 构建自己的知识体系
- 我是如何做笔记的
- 有效的提问
- 谨防思维定势
- 学会与上级沟通
- 想清楚再去做
- 碎片化学习
- 第六部分 思维导图(付费)
- 技术基础篇
- 技术框架篇
- 数据存储篇
- 项目实战篇
- 第七部分 吾爱开源
- 7-1 麻雀聊天
- 项目启动
- 前端登录无请求问题解决
- websocket测试
- 7-2 ocp微服务框架
- evm框架集成
- 项目构建与集成
- zentao-center
- 二次开发:初始框架的搭建
- 二次开发:增加细分菜单、权限到应用
- 7-3 书栈网
- 项目启动
- 源码分析
- 我的书架
- 文章发布机制
- IM
- 第八章 团队管理篇
- 大厂是怎么运作的
- 第九章 码山有道
- 简历内推
- 联系我内推
- 第十章 学点前端
- Vue