SpringBoot OAuth2.0 使用短信验证码登录授权

实现步骤:

  • 自定义授权器,继承 AbstractTokenGranter 类;
  • 重写 getOAuth2Authentication 函数,在这个函数中,自定义授权认证逻辑;
  • 校验手机号 + 短信验证码是否一致
  • getOAuth2Authentication, 手机和验证码校验无误, 返回 OAuth2Authentication 授权信息(access_token)

创建 SmsCodeTokenGranter 继承 AbstractTokenGranter

public class SmsCodeTokenGranter extends AbstractTokenGranter {private static final String SMS_GRANT_TYPE = "sms_code";private AccountService accountService;public SmsCodeTokenGranter(AuthorizationServerTokenServices tokenServices,ClientDetailsService clientDetailsService,OAuth2RequestFactory requestFactory) {super(tokenServices, clientDetailsService, requestFactory, SMS_GRANT_TYPE);}public void setAccountService(AccountService accountService) {this.accountService = accountService;}@Overrideprotected OAuth2Authentication getOAuth2Authentication(ClientDetails client,TokenRequest tokenRequest) {Map<String, String> parameters =new LinkedHashMap<String, String>(tokenRequest.getRequestParameters());// 客户端提交的手机号码String phoneNumber = parameters.get(CommonConstant.DEFAULT_PARAMETER_NAME_PHONE);if (StringUtils.isBlank(phoneNumber)) {throw new BusinessException(ResultCode.PHONE_NUMBER_IS_EMPTY);}// 客户端提交的验证码String smsCode = parameters.get(CommonConstant.DEFAULT_PARAMETER_NAME_CODE_SMS);if (!smsCode.equals("9876")) {throw new BusinessException(ResultCode.SMS_CODE_ERROR);}// 客户端提交的手机号码AccountDTO accountDTO = accountService.getAccountByPhone(phoneNumber);// TODO: if account not exist , create a new account ??if (ObjectUtils.isEmpty(accountDTO)) {throw new BusinessException(ResultCode.PHONE_NOT_EXITS);}// TODO: 权限查询 etc...RoleDTO role = new RoleDTO();role.setRole("USER");//accountService.getAccountRole(accountDTO.getAccountId());// 根据手机号码查询用户 ...List<GrantedAuthority> grantedAuthorities = new ArrayList<>();grantedAuthorities.add(new SimpleGrantedAuthority(role.getRole()));UserDetails user = new MooseUserDetails(accountDTO, null, grantedAuthorities);// 验证用户状态(是否禁用 etc...)Authentication userAuth =new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());// org.springframework.security.core.userdetails.UserDetails 接口的, 所以有 user.getAuthorities()// 当然该参数传null也行((AbstractAuthenticationToken) userAuth).setDetails(parameters);OAuth2Request storedOAuth2Request =getRequestFactory().createOAuth2Request(client, tokenRequest);return new OAuth2Authentication(storedOAuth2Request, userAuth);}
}

在 MooseAuthorizationServerConfiguration 添加授权类型

/*** 添加自定义授权类型** @return List<TokenGranter>*/private TokenGranter tokenGranter(final AuthorizationServerEndpointsConfigurer endpoints) {// endpoints.getTokenGranter() 获取SpringSecurity OAuth2.0 现有的授权类型List<TokenGranter> granters =new ArrayList<TokenGranter>(Collections.singletonList(endpoints.getTokenGranter()));// 构建短信验证授权类型SmsCodeTokenGranter smsCodeTokenGranter =new SmsCodeTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(),endpoints.getOAuth2RequestFactory());smsCodeTokenGranter.setAccountService(accountService);// 向集合中添加短信授权类型granters.add(smsCodeTokenGranter);// 返回所有类型return new CompositeTokenGranter(granters);}

在 MooseAuthorizationServerConfiguration configure 添加所有端点信息

/*** Authorization Server endpoints.** @throws Exception*/@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.tokenGranter(tokenGranter(endpoints)).tokenStore(tokenStore()).exceptionTranslator(customOAuth2ResponseExceptionTranslator);// 用于支持密码模式endpoints.authenticationManager(authenticationManager);// userDetailsService refresh_tokenendpoints.userDetailsService(userDetailsService);}

启动服务测试

grant_type:sms_code
client_id:client
client_secret:secret
phone:1537031501
smsCode:9876

localhost:7000/oauth/token?grant_type=sms_code&client_id=client&client_secret=secret&phone=1537031501&smsCode=9876

短信验证码输入错误

短信验证码和手机号码都输入正确

携带 access_token 访问接口

关注公众号 「全栈技术部」,不断学习更多有趣的技术知识。

SpringBoot OAuth2.0 使用短信验证码登录授权相关推荐

  1. 手把手带你在集成SpringSecurity的SpringBoot应用中添加短信验证码登录认证功能

    本文目录 前言 1 自定义AuthenticationToken类 2 自定义AuthenticationProvider类 3 自定义MobilePhoneAuthenticationFilter ...

  2. SpringBoot基于Session实现短信验证码登录

  3. OAuth2.0 - 自定义模式授权 - 短信验证码登录

    一.OAuth2.0 - 自定义模式授权 上篇文章我们分析了目前的情况,演示了微服务的大环境下在保证安全的情况下通过SpringGateWay实现统一的鉴权处理,但是前面的演示中,我们都是基于用户名密 ...

  4. Spring Security OAuth2 优雅的集成短信验证码登录以及第三方登录

    基于SpringCloud做微服务架构分布式系统时,OAuth2.0作为认证的业内标准,Spring Security OAuth2也提供了全套的解决方案来支持在Spring Cloud/Spring ...

  5. SpringBoot + SpringSecurity 短信验证码登录功能实现

    实现原理 在之前的文章中,我们介绍了普通的帐号密码登录的方式:SpringBoot + Spring Security 基本使用及个性化登录配置(http://www.deiniu.com/artic ...

  6. springboot手机短信验证码登录

    手机短信验证码登录 方法 总结 方法 *1.获取手机验证码 /*** 获取手机验证码*/@RequestMapping("/getVerificationCode")@Respon ...

  7. 短信验证码登录,以及第三方登录

    短信验证码登录 首先去阿里云服务器开通短信服务功能,进入短信服务界面 点击国内消息,申请一个签名和模板 申请一个AccessKey,并且将短信服务的权限加入其中 加入相关的依赖 <depende ...

  8. 最新web/springboot打造通用的短信验证码微服务(详细)

    前言 很久之前的一篇文章, 最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细),截止到目前,依然有很多小伙伴,私信需要帮助,于是我再加一篇,让大家能更好的使用.(当然 ...

  9. cas5.3.9自定义手机短信验证码登录

    cas自定义多种登录方式 cas添加手机短信验证码登录 cas添加手机短信验证码登录 全部基于SpringBoot,以及SpringWebflow开发,请在有此基础再进行学习! 添加Maven依赖 & ...

最新文章

  1. Oracle-RAC等价性验证错误:Result: PRVF-4007 : User equivalence check failed for user grid
  2. python序列_什么是Python的序列协议?
  3. stripslashes和addslashes的区别
  4. php配置文件php.ini的详细解析(续)
  5. Zing加快了JVM应用程序的预热
  6. 工作378-封装axios方法
  7. 《操作系统》OS学习(二):启动、中断、异常
  8. Java高级语法笔记-文件及目录操作
  9. Graph Valid Tree
  10. r语言TeachingDemos包绘制黑白脸谱图
  11. 181002有道扇贝每日一句
  12. python控制、监听鼠标键盘
  13. 利用C#编写一个附和闭合导线平差程序
  14. 算法导论第三版详细答案
  15. 常用z反变换公式表_高中数学三角函数题型总结归纳,同角三角函数及诱导公式...
  16. PPT开场,吸引人的几点技巧
  17. 视频插帧论文阅读(一)——FLAVR
  18. oracle羊毛,弃Cloudflare,薅Oracle羊毛
  19. 爬虫登陆实战 --- QQ音乐扫码登陆
  20. python弹球游戏添加一个球_Python实现的弹球小游戏示例

热门文章

  1. 杭电和南邮计算机考研哪个好考,南京邮电大学研究生,二本考南邮研究生!
  2. 最常用的 12 个物联网协议和标准
  3. 脉冲雷达系统设计与Matlab仿真【附仿真代码】
  4. WIN TO GO (WTG):windows装入U盘 WTG安装+拔出U盘强制关机蓝屏处理(win10)
  5. 使用USBwriter制作启动盘后,恢复U盘容量
  6. 使png 图片在网页上透明显示
  7. GoodNotes 模板分享
  8. google chrome 谷歌浏览器 清除 清空 缓存cookie 快捷键
  9. 计算机清理垃圾文件丢失怎么恢复,电脑文件数据删除怎么恢复-互盾数据恢复软件...
  10. c语言程序化交易:如何计算K线指标