当前位置: 首页 > news >正文

【SpringBoot- OAuth2授权认证】

OAuth2授权认证

模式描述

img

授权服务

验证第三方服务的身份,验证邮箱用户的身份,记录和管理认证Token,为资源服务器提供Token校验。

场景:第三方网站借助用户的邮箱登录,并访问邮箱账户的基础信息,头像、名称等。

资源服务

第三方服务通过邮箱账户登录后需要获取的一些信息,即理解为资源,存储邮箱账户的数据资源。

第三方服务

即借助邮箱用户的账户,快速登录第三个服务,免去繁杂的注册流程,有助于快速积累新用户。

交互流程

第三方服务给用户开放快速邮箱登录功能,引导用户调到邮箱认证服务,通过认证后返回身份令牌到第三方服务,第三方服务携带令牌访问邮箱的资源服务,获取一些基本的邮箱用户信息。

项目配置管理

1、案例结构

img

核心依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId><version>2.1.3.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

这里有两个核心组件依赖:OAuth2组件和Security组件。

模块划分

  • auth-server:授权服务
  • resource-server:资源服务器
  • third-server:第三个服务

2、配置描述

【授权服务】

OAuth2配置

这里的配置管理的是第三方的授权流程和发放给第三方的身份证明ClientID和密码,实际的场景就是第三方借助邮箱账号登录,首先就是向邮箱管理方提供材料,获取访问邮箱服务的身份证明,然后才能对接开放服务,这种模式在第三方对接业务中很常见。

/*** 模拟第三方授权配置*/
@EnableAuthorizationServer
@Configuration
public class AuthConfig extends AuthorizationServerConfigurerAdapter {@ResourceClientDetailsService clientDetailsService;/*** 资源服务器校验Token*/@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) {security.checkTokenAccess("permitAll()").allowFormAuthenticationForClients();}/*** 第三方客户端请求配置,和资源服务访问的配置,不设置默认都可以访问,提供默认回调地址*/@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("third01").secret(new BCryptPasswordEncoder().encode("third01")).resourceIds("resource-01").authorizedGrantTypes("authorization_code","refresh_token").scopes("all").redirectUris("http://localhost:8082/notify.html");}/*** 配置访问端点*/@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) {endpoints.authorizationCodeServices(authorizationCodeServices()).tokenServices(tokenServices());}/*** 内存管理*/@BeanAuthorizationCodeServices authorizationCodeServices() {return new InMemoryAuthorizationCodeServices();}/*** Token管理规则*/@BeanAuthorizationServerTokenServices tokenServices() {DefaultTokenServices services = new DefaultTokenServices();services.setClientDetailsService(clientDetailsService);services.setSupportRefreshToken(true);services.setTokenStore(tokenStore());services.setAccessTokenValiditySeconds(3600);services.setRefreshTokenValiditySeconds(3600*7);return services;}@BeanTokenStore tokenStore() {return new InMemoryTokenStore();}
}

通常需要数据库存储第三方信息,可以到第OAuth2开源项目中,获取表结构放到本地数据库中,然后这里换成数据源加载模式即可,简单的流程管理都在源码里写了SQL语句,数据源引入即可。

Security配置

/*** 模拟本地用户配置*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {/*** 密码加密方式*/@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}/*** 内存中虚拟用户和角色*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password(new BCryptPasswordEncoder().encode("123456")).roles("user");}/*** 表单登录*/@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().formLogin();}
}

基于这里的配置管理邮箱用户的认证流程,例如使用邮箱账号密码登录验证,判断授权是否成立,这里管理的是服务本地的邮箱账号,基于数据源存储数据在下面案例中都有。

关于Spring框架中安全认证的相关的几个组件,在使用OAuth2之前可以先了解一下。

【资源服务】

主要功能有三块,配置第三方携带的Token身份令牌校验机制,即访问授权服务校验接口,这里是OAuth2自定义好的接口;配置resourceId资源服务的编号,用来控制第三个服务能访问的资源服务范围,属于大的权限点控制;模拟校验用户的Role角色,较精细的控制权限。

/*** 资源服务管理配置*/
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {/*** Token令牌校验*/@BeanRemoteTokenServices tokenServices() {RemoteTokenServices services = new RemoteTokenServices();services.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token");services.setClientId("third01");services.setClientSecret("third01");return services;}/*** 服务资源ID配置*/@Overridepublic void configure(ResourceServerSecurityConfigurer resources) throws Exception {resources.resourceId("resource-01").tokenServices(tokenServices());}/*** 模拟用户权限规则*/@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/user/**").hasRole("user").anyRequest().authenticated();}
}

【第三方服务】

主要提供两个流程的模拟:请求授权服务获取身份令牌;携带身份令牌请求资源服务获取数据。这里则是授权码回调接口的处理方式。

@Controller
public class NotifyController {private static final Logger LOG = LoggerFactory.getLogger(NotifyController.class);@Resourceprivate RestTemplate restTemplate;@GetMapping("/notify.html")public String notify(String code, Model model) {if (code != null) {MultiValueMap<String, String> map = new LinkedMultiValueMap<>();map.add("code", code);map.add("client_id", "third01");map.add("client_secret", "third01");map.add("redirect_uri", "http://localhost:8082/notify.html");map.add("grant_type", "authorization_code");Map<String,String> resp = restTemplate.postForObject("http://localhost:8080/oauth/token", map, Map.class);String accessToken = resp.get("access_token");LOG.info("身份令牌:{}",accessToken);HttpHeaders headers = new HttpHeaders();headers.add("Authorization", "Bearer " + accessToken);HttpEntity<Object> httpEntity = new HttpEntity<>(headers);ResponseEntity<String> entity = restTemplate.exchange("http://localhost:8081/user/resource", HttpMethod.GET, httpEntity, String.class);model.addAttribute("notifyMsg", entity.getBody());}return "notify";}
}

三、测试流程

img

通过上述测试流程,对比常见的第三方登录机制,理解OAuth2的授权码模式。

参考源码:https://gitee.com/cicadasmile/middle-ware-parent/tree/master/ware26-oauth2-parent

第一请求业务的主页

img

第二选择登录方式后跳转

img

第三根据选择的登录方式输入登录信息

img

第四登录成功后请求资源数据

img

http://www.jsqmd.com/news/644834/

相关文章:

  • 告别模糊:ENVI中NNDiffuse融合算法实战,让GF2多光谱影像细节拉满
  • Sharetribe Go搜索功能实现原理:基于Sphinx的全文搜索引擎配置
  • 微信视频号推荐算法实战:从GNN到DCN-M的多任务优化探索
  • Electron 开发避坑指南:解决主进程通信、热更新与打包配置中的常见问题
  • Cellpose 4.0.4:零参数细胞分割算法如何让生物医学图像分析变得简单
  • SZT-bigdata数据质量监控:确保分析结果的准确性
  • Kazumi番剧播放器:打造个性化追番体验的完整指南
  • 终极指南:如何用Fan Control免费软件彻底解决电脑噪音与散热问题
  • Chart.js项目贡献指南:如何为awesome列表添加新内容
  • probe-rs项目架构深度剖析:从探针驱动到调试协议的完整实现
  • 5分钟快速上手VTube Studio:打造专业虚拟主播的完整指南
  • Claude Skills到底解决了什么,没解决什么?从代码审查看AI技能模块化的真实代价
  • 你的Endnote样式可能白下了!关于GB/T 7714-2005,这些细节(全角标点、作者“等”、学位论文地点)坑了太多人
  • 【实战】Hermes Agent 深度体验:开源自进化 AI 智能体,三层记忆+自动 Skills+6 平台网关
  • TransformationLayout配置详解:从基础属性到高级参数的完整教程
  • IEA-15-240-RWT 15MW海上风机开源模型:从架构解析到实战部署的完整指南
  • Sakura-13B-Galgame终极配置指南:如何快速部署你的专属ACGN翻译AI
  • 终极指南:3步免费将VR 3D视频转为2D,普通设备也能自由探索VR世界
  • 告别抓瞎!手把手教你用CANoe 10.0从零搭建汽车总线测试环境(VN1640A/VN1630硬件实战)
  • DSAnimStudio完整指南:从零掌握专业游戏动画编辑的终极教程
  • 3分钟搞定Windows UEFI启动画面:告别单调开机界面
  • 汽车轮毂轴承数据集 差速器轴承数据集 轮毂轴承数据集 轮毂轴承单元 DAC外圈数据集的训练及应用 汽车零部件的细分领域
  • ComfyUI IPAdapter Plus:如何用单张参考图像实现精准风格迁移?
  • 双鱼眼相机福音:实测CVPR2024的EfficientLoFTR,在纹理单调场景下拼接效果提升明显
  • 终极指南:如何免费解锁Cursor Pro全部功能
  • 告别云端API调用:用openEuler+Dify+Ollama搭建你的私有AI应用工厂
  • SPSS实战:Pearson相关性分析与散点图可视化全流程解析
  • LCD1602显示+蜂鸣器提示:给你的51单片机抢答器程序加点‘高级感’(Proteus仿真文件分享)
  • 避开这7个SEO误区:我用Ahrefs工具拯救网站排名的真实案例
  • limelight.vim 操作符映射:深入理解 <Plug> 映射机制