11 | 实战案例:使用Spring Security搭建一套基于JWT的OAuth 2.0架构
朱晔
《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
《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-1021 - 布吉岛csrf攻击不讲嘛?
作者回复: 为啥要讲呢
2020-08-151 - Geek_fb74a8请教一下老师,使用jwt的话应该怎么处理过期以及登出等处理?可否将jwt令牌存入Redis?
作者回复: jwt可以自验证 要实现登出等 需要改为透明token
2020-08-0631 - 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 -pubkey2021-05-11110
- 而立斋爱了,我要去手撸一遍,验证一下真伪。哈哈2020-07-236
- Younger Ku能把源码带着看一遍,再把经常需要定制化的地方讲一下就好了。无论如何只停留在demo使用层面总感觉心里不踏实。2020-08-195
- 行一善生成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 -pubkey2022-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-1832
- Anony客户端使用了@EnableOAuth2Sso,里面包含自己的WebSecurity会拦截所有请求。而后自己定义的WebSecurity,Order是200,实际上是不起作用的吧,即使让某些url permitAll,也会直接跳转到授权服务器的登录页。请求都会直接被靠前的EnableOAuth2Sso里的过滤链处理 。2020-12-0212
收起评论