关于OAuth的介绍查看我的另一篇文章OAuth的4种授权方式,spring-security-oauth2是实现OAuth2.0的框架,配置稍微有些繁琐,因此本文记录下大概的思路,加深印象。

OAuth 2.0中主要有Authorization Service授权服务和Resource Service资源服务,他们可以在同一个应用程序中,也可以在两个应用程序中,甚至多个资源服务共享一个授权服务。

spring-security提供了相应的endpoints来管理token的请求,/oauth/authorize端点负责授权服务,/oauth/token端点负责token的请求服务;资源服务中的过滤器OAuth2AuthenticationProcessingFilter 负责校验Token。

下面从总体上介绍授权服务和资源服务的主要配置,详细的配置在githubspring-security-oauth demo上。

授权服务配置


@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {private static final String DEMO_RESOURCE_ID = "openapi";@Autowiredprivate OrderAuthProperties orderAuthProperties;/*** 注意这里AuthenticationManager和UserAccountService* 是在SecurityConfiguration配置的,把俩个配置类关联了起来*/@AutowiredAuthenticationManager authenticationManager;@Autowiredprivate UserAccountService userAccountService;@Autowiredprivate AuthorizationCodeServices authorizationCodeServices;@AutowiredRedisConnectionFactory redisConnectionFactory;@Autowiredprivate OAuthClientDetailsService oAuthClientDetailsService;@Autowiredprivate DataSource dataSource;/*** 配置第三方客户端的信息,可以从内存中加载,也可以从数据库加载(更常用)*/@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.jdbc(dataSource);clients.withClientDetails(oAuthClientDetailsService);// 这里将第三方客户端放到内存里,配置两个客户端,一个用于client认证
//        clients.inMemory()
//                .withClient("client_1")
//                .resourceIds(DEMO_RESOURCE_ID)
//                .authorizedGrantTypes("client_credentials", "refresh_token")
//                .scopes("select")
//                .authorities("client")
//                .secret("123456")
//                .and().withClient("client_2")
//                .secret("123456")
//                .resourceIds(DEMO_RESOURCE_ID)
//                .authorizedGrantTypes("authorization_code", "code", "password", "refresh_token")
//                .scopes("select")
//                .redirectUris("http://www.baidu.com");}/*** 定义token endpoint的安全配置*/@Overridepublic void configure(AuthorizationServerSecurityConfigurer oauthServer) {oauthServer.realm("oauth2-resources").tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()").passwordEncoder(clientPasswordEncoder()).allowFormAuthenticationForClients();}/*** 第三方客户端使用加密方式*/@Beanpublic PasswordEncoder clientPasswordEncoder() {// 不做加密处理,明文存储return NoOpPasswordEncoder.getInstance();}/*** 定义授权、token endpoint和token服务,即如何生成token和token存储在哪里(内存/数据库/JWT)** <p>* 这里最重要的就是DefaultTokenServices,默认是生成随机值作为token* <p>*/@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) {// 这里设置了两个TokenEnhancer,可改变token值,它会在token生成后/保存前调用TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter()));endpoints.authenticationManager(authenticationManager) // 注入authenticationManager开启密码授权模式// 必须要配置userDetailsService,才支持refresh token grant,to ensure that the account is still active// 这里和SecurityConfiguration的userAccountService也可以不一样,为什么?.userDetailsService(userAccountService).authorizationCodeServices(authorizationCodeServices) // 定义authorizationCodeServices支持auth code grant..tokenStore(tokenStore()).tokenEnhancer(tokenEnhancerChain);}/*** TokenEnhancer** JWT提供的,帮助把OAuth认证信息转为JWT,即access_token,它返回的很多默认字段(jti,ati)都是在这里定义的*/@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();// 这里使用的密钥也要定义在资源服务里,以便资源服务也可以校验token,否则认证服务就要提供校验token的接口给资源服务converter.setSigningKey(orderAuthProperties.getOauthJwtSecret());return converter;}/*** TokenEnhancer** 向token里添加自定义信息*/@Beanpublic JwtTokenEnhancer tokenEnhancer() {return new JwtTokenEnhancer();}/*** 定义token的存储方式:可以放在redis/数据库(oauth_access_token表)/内存,或者jwt中* 这里放在JWT里,根本就不必后端存储token了,这是JWT很大的优势** 但是JWT也有缺点,1.不容易撤销授权,所以一般令牌时效性很短,撤销授权可以在刷新时实现,怎么实现?* 2.如果要存储的信息很多,令牌会变得很大*/@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());}
}

spring-security-oauth2实现OAuth2.0服务相关推荐

  1. 使用Spring Security和OAuth 2.0保护Spring微服务架构

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个开发 ...

  2. Spring Security(二):OAuth2协议

    ​ Spring Security(二):OAuth2.0协议 活动地址:CSDN21天学习挑战赛 今天学习与研究了OAuth2.0协议,记录一下,方便后面查阅 OAuth2.0即是一个开放标准,我们 ...

  3. oauth2_带有Spring Security的OAuth 2.0快速指南

    oauth2 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验 ...

  4. 带有Spring Security的OAuth 2.0快速指南

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在构建W ...

  5. Spring Security 5.x+OAuth2.0+OIDC1.0

    Spring Security+OAuth2.0+OIDC1.0 文章目录 Spring Security+OAuth2.0+OIDC1.0 前言 一.准备工作 1.Spring Security相关 ...

  6. SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

    因为目前做了一个基于Spring Cloud的微服务项目,所以了解到了OAuth2,打算整合一下OAuth2来实现统一授权.关于OAuth是一个关于授权的开放网络标准,目前的版本是2.0,这里我就不多 ...

  7. Spring Security(5) 整合OAuth2

    文章目录 一.前言 二.什么是OAuth2? 三.应用场景 四.三部分 五.四种授权模式 1. 授权码模式(authorization code) 2. 简化模式(implicit) 3. 密码模式( ...

  8. (二)spring security:使用 OAuth2 SSO 实现单点登录

    一.前言 也许,我应该延续上一篇"(一)spring security:能做什么?"接着写,比如:如何实现RBAC权限动态控制.后端"验证码"生成与校验.JWT ...

  9. Spring Security——简单第三方OAuth2登录自动配置——GitHub登录DEMO

    GitHub OAuth2 APP申请 https://github.com/settings/applications/new Maven <!--Spring Security-->& ...

  10. Spring Boot+Vue/前后端分离/高并发/秒杀实战课程之spring Security快速搭建oauth2 内存版身份认证

    Springboot快速搭建oauth2 内存版身份认证 环境准备 点击[Create New Project]创建一个新的项目 项目环境配置 配置Thymeleaf 搭建oauth2认证,加入两个依 ...

最新文章

  1. python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法
  2. redis10---Setbit 的实际应用
  3. C语言经典例100-将学生成绩写入文件
  4. 机器学习入门学习笔记:(2.4)线性判别分析理论推导
  5. H.266 参考软件VTM下载和安装
  6. SAP web 开发 (第二篇 bsp 开发 mvc模式 Part2 )
  7. RuntimeException:java.lang.ClassNotFoundException: Class wordcount.WordCountMapper not fonud
  8. Linux系统:centos7下搭建ZooKeeper3.4中间件,常用命令总结
  9. noi 3531 判断整除
  10. MAC使用find命令的正确办法
  11. 查看maven,JDK版本号
  12. 计算线性回归方程和相应系数
  13. access数据库窗体设计实验报告_Access2010实验报告
  14. 企业微信管理员可以看到打卡位置吗
  15. 鉴频鉴相器(PFD)不同结构讨论
  16. 为什么程序员做外包会被瞧不起
  17. 内事不决问张昭,外事不决问周瑜,“ 排序 ”不决问威少
  18. 【信息安全案例】——系统软件安全(学习笔记)
  19. 电脑白屏,电脑白屏了按哪个键可以修复?
  20. 执行git merge,合并两个分支的代码,其中某个分支的文件或代码被删除或被覆盖

热门文章

  1. 杭十四计算机教室,杭十四中学生做了个图书馆智能机器人
  2. HTML字体怎么显示,教你如何用CSS来控制网页字体的显示样式
  3. Satwe楼板能用弹性模计算吗_现浇楼板淋水后却出现裂缝,还好老师傅有经验,多是这3点造成的...
  4. 十二、Powerbi绘制人员地区分布图和后期学习
  5. sklearn数据预处理
  6. 额外篇 | basemap(下)
  7. 三十七、下篇 | tkinter实现一个翻译软件
  8. java常用工具类_java(二):工作中常用到的工具类
  9. 推翻Hinton NeurIPS论文结论!审稿人评价:该文章在标签平滑和知识蒸馏的关系上取得了重大突破!...
  10. ACM MM 2020视频目标检测挑战赛冠军DeepBlueAI团队技术分享