OAuth 2.0 实战课
王新栋
京东资深架构师
16397 人已学习
新⼈⾸单¥29
登录后,你可以任选2讲全文学习
课程目录
已完结/共 17 讲
开篇词 (1讲)
OAuth 2.0 实战课
15
15
1.0x
00:00/00:00
登录|注册

11 | 实战案例:使用Spring Security搭建一套基于JWT的OAuth 2.0架构

你好,我朱晔,是《Java 业务开发常见错误 100 例》专栏课程的作者。
《OAuth 2.0 实战课》上线之后,我也第一时间关注了这门课。在开篇词中,我看到有一些同学留言问道:“如何使用 Spring Security 来实现 OAuth 2.0?”这时,我想到之前自己写过一篇相关的文章,于是就直接在开篇词下留了言。后面我很快收到了不少用户的点赞和肯定,紧接着极客时间编辑也邀请我从自己的角度为专栏写篇加餐。好吧,功不唐捐,于是我就将之前我写的那篇老文章再次迭代、整理为今天的这一讲内容,希望可以帮助你掌握 OAuth 2.0。
如果你熟悉 Spring Security 的话,肯定知道它因为功能多、组件抽象程度高、配置方式多样,导致了强大且复杂的特性。也因此,Spring Security 的学习成本几乎是 Spring 家族中最高的。但不仅于此,在结合实际的复杂业务场景使用 Spring Security 时,我们还要去理解一些组件的工作原理和流程,不然需要自定义和扩展框架的时候就会手足无措。这就让使用 Spring Security 的门槛更高了。
因此,在决定使用 Spring Security 搭建整套安全体系(授权、认证、权限、审计)之前,我们还需要考虑的是:将来我们的业务会多复杂,徒手写一套安全体系来得划算,还是使用 Spring Security 更好?我相信,这也是王老师给出课程配套代码中,并没有使用 Spring Security 来演示 OAuth 2.0 流程的原因之一。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了作者使用Spring Security搭建基于JWT的OAuth 2.0架构的实战案例。作者首先讨论了Spring Security的复杂性和学习成本,以及在实际业务场景中使用Spring Security的门槛。然后,作者结合自己的实践和积累,详细介绍了如何使用Spring Security逐步搭建基于JWT的OAuth 2.0授权体系。文章涵盖了OAuth 2.0的三角色、授权许可类型以及权限控制,并演示了使用OAuth 2.0实现SSO单点登录体系。接着,作者提供了项目准备工作,包括创建父POM和初始化数据库结构。最后,文章提到了搭建授权服务器和受保护资源服务器的下一步工作。整体而言,本文通过实际案例向读者展示了如何使用Spring Security构建基于JWT的OAuth 2.0架构,为读者提供了一手的实践经验和技术指导。文章内容详实,包括了项目框架搭建、授权服务器配置、安全方面的配置等多个方面,适合想要深入了解Spring Security和OAuth 2.0的读者阅读学习。文章还介绍了初始化数据配置和演示三种授权许可类型,为读者提供了全面的实践指导和技术应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OAuth 2.0 实战课》
新⼈⾸单¥29
立即购买
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • benxiong
    创建表的时候报错了: CREATE TABLE `oauth_client_details` ( `client_id` varchar(255) NOT NULL, `resource_ids` varchar(255) DEFAULT NULL, `client_secret` varchar(255) DEFAULT NULL, `scope` varchar(255) DEFAULT NULL, `authorized_grant_types` varchar(255) DEFAULT NULL, `web_server_redirect_uri` varchar(255) DEFAULT NULL, `authorities` varchar(255) DEFAULT NULL, `access_token_validity` int(11) DEFAULT NULL, `refresh_token_validity` int(11) DEFAULT NULL, `additional_information` varchar(255) DEFAULT NULL, `autoapprove` varchar(255) DEFAULT NULL, PRIMARY KEY (`client_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 > 1071 - Specified key was too long; max key length is 767 bytes > 时间: 0s 网上说是 mysql innodb存储引擎 的 varchar 主键只支持不超过767个字节 或者 768/2=384个双字节 或者767/3=255个三字节 或者 767/4=191个四字节的字段,GBK是双字节的,UTF8是三字节的,utf8mb4是四字节的,我按照这个说法,把主键 client_id 字段长度改为 VARCHAR(111),就创建成功了。 但是我是很信服朱晔老师的,他非常严谨,他肯定是测试通过以后才发表的文章,所以我觉得应该还有别的原因导致他可以创建,而我却报错。 这个原因期待老师和别的小伙伴帮忙解答。

    作者回复: MySQL 5.7 之后这个限制放宽到了 3072 字节,所以我没问题

    2020-09-10
    2
    1
  • 布吉岛
    csrf攻击不讲嘛?

    作者回复: 为啥要讲呢

    2020-08-15
    1
  • Geek_fb74a8
    请教一下老师,使用jwt的话应该怎么处理过期以及登出等处理?可否将jwt令牌存入Redis?

    作者回复: jwt可以自验证 要实现登出等 需要改为透明token

    2020-08-06
    3
    1
  • Tim Zhang
    有个问题,请指教: 我的需求是想开发一个统一认证平台,公司内所有应用需要认证,资源权限管控的都走这个应用 用户首先访问a应用的某个webapi(受保护应用),a应用发现token不存在,跳转到我的统一认证授权中心的登录界面,选择使用微信进行认证,认证成功后,根据我的数据库中的rbac表,查询这个用户在a应用的权限与角色,生成token,将token返回给受保护资源的应用a,然后a应用进行验证。 我的问题如下: 1、那些刷新accesstoken,refrshtoken过期的重新跳转的逻辑,是否只能写在不同a、b、c、d这些受保护资源应用的filter逻辑中 2、比如公司有100个应用需要做认证授权,是否这些应用的(用户,角色,资源)表结构都维护在统一认证中心所对应的db中。 3、我看老师引用了网关,是否网关可以切面做掉点通用逻辑 4、受保护资源保护的资源(webapi),假设是基于http rest的spring mvc编写的,是否就是那些control ler中的路由url,在这些url之上使用切面逻辑来验证token中的资源权限是否与当前路由匹配(比如验证http方法+url路径) 5、受保护资源应用自己的数据库中假设存有用户表,是否还要与统一认证中的用户表进行实时关联,比如a应用的用户aa删除了,还需要实时删除统一认证中的aa用户在a应用中的数据 问题较多,乱,请老师抽空回复下,谢谢了

    作者回复: 1、这些SpringSecurity都可以直接做 2、权限应该统一维护在认证中心比较好 3、微服务网关可以做token到uid的翻译以及鉴权 4、SpringSecurity都可以直接做 5、用户表应该只存在一处,比如认证中心,其他系统都存uid关联

    2020-07-24
  • 导出公钥证书的命令:keytool -list -rfc --keystore mytest.jks | openssl x509 -inform pem -pubkey
    2021-05-11
    1
    10
  • 而立斋
    爱了,我要去手撸一遍,验证一下真伪。哈哈
    2020-07-23
    6
  • Younger Ku
    能把源码带着看一遍,再把经常需要定制化的地方讲一下就好了。无论如何只停留在demo使用层面总感觉心里不踏实。
    2020-08-19
    5
  • 行一善
    生成jks密钥库 生成.jks文件 keytool -genkey -alias tutorialspedia -keyalg RSA -keystore "/home/yaoshenglu/keytool/tutorialspedia.jks" keytool -genkey -alias jwt -keyalg RSA -keystore "/home/yaoshenglu/keytool/jwt.jks" 导出公共证书 .cer文件 keytool -export -alias tutorialspedia -file "/home/yaoshenglu/keytool/tutorialspedia_public_cert.cer" -keystore "/home/yaoshenglu/keytool/tutorialspedia.jks" keytool -export -alias jwt -file "/home/yaoshenglu/keytool/public.cert" -keystore "/home/yaoshenglu/keytool/jwt.jks" 查看公钥 keytool -list -rfc --keystore tutorialspedia.jks | openssl x509 -inform pem -pubkey keytool -list -rfc --keystore jwt.jks | openssl x509 -inform pem -pubkey
    2022-08-05归属地:浙江
    2
  • Geek_0d99c9
    代码有点问题.直接访问8082/ 还是被重定向到login页面.OAuth2ClientApplication这个里面的EnableOAuth2Sso注解会覆盖WebSecurityConfig里面的免登录配置.所以应该把两个合并下 package me.josephzhu.springsecurity101.cloud.auth.client; import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.oauth2.client.OAuth2ClientContext; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails; @EnableOAuth2Sso @Configuration @Order(200) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { /** * /路径和/login路径允许访问,其它路径需要身份认证后才能访问 * * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/test","/", "/login**","/**/test","/ui/test", "/logout") .permitAll() .anyRequest() .authenticated().and() .logout().logoutSuccessUrl("/");; } @Bean public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oAuth2ClientContext, OAuth2ProtectedResourceDetails details) { return new OAuth2RestTemplate(details, oAuth2ClientContext); } }
    2020-12-18
    3
    2
  • Anony
    客户端使用了@EnableOAuth2Sso,里面包含自己的WebSecurity会拦截所有请求。而后自己定义的WebSecurity,Order是200,实际上是不起作用的吧,即使让某些url permitAll,也会直接跳转到授权服务器的登录页。请求都会直接被靠前的EnableOAuth2Sso里的过滤链处理 。
    2020-12-02
    1
    2
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部