SpringBoot下如何实现token短信验证登入登出权限操作
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章给大家分享的是有关SpringBoot下如何实现token短信验证登入登出权限操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SpringBoot下token短信
千家信息网最后更新 2025年11月13日SpringBoot下如何实现token短信验证登入登出权限操作
这篇文章给大家分享的是有关SpringBoot下如何实现token短信验证登入登出权限操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
SpringBoot下token短信验证登入登出(token存放redis)
不对SpringBoot进行介绍,具体的可以参考官方文档
思路:获取短信(验证并限制发送次数,将code存放redis)-->登入(验证并限制错误次数,将用户信息及权限放token,token放redis)-->查询操作(略),主要将前两点,不足的希望指出,谢谢
步骤:
1.整合Redis需要的依赖,yml自行配置,ali短信接口依赖(使用引入外部包的方式)
org.springframework.boot spring-boot-starter-data-redis ....... ali taobao-sdk-java-auto system ${project.basedir}/libs/taobao-sdk-java-auto.jar org.springframework.boot spring-boot-maven-plugin org.springframework.boot spring-boot-maven-plugin true
2.ali短信接口工具类,发送验证码
@Autowired private StringRedisTemplate redisTemplate;....略....//查询是否有此用户,记录单位时间内发送短信次数,并限制发送次数Account account = accountService.findByUserName(phone);if (account==null){ return ResultVOUtil.erro(0,"未注册用户"); }ValueOperations ops = redisTemplate.opsForValue();String getTimes = ops.get(account + "code");Integer gts=getTimes==null?0:Integer.valueOf(getTimes);if (gts>5){ return ResultVOUtil.erro(0,"获取短信次数过多,请稍后再试");}ops.set(account+"code",String.valueOf(gts+1),5,TimeUnit.MINUTES);NoteUtils noteUtils=new NoteUtils();String validCode = UidUtil.getValidCode(); //生成随机数try { String yzmcode = noteUtils.yzmcode(validCode, phone); //redis设置验证码有效时间5分组 ops.set(phone,validCode,5,TimeUnit.MINUTES); }catch (Exception e){ throw new YunExceptions(0,"获取验证码服务器bug"); } //短信接口工具类public class NoteUtils { //仅当示例:具体参考官方文档 public String url="***************"; public String appkey="****************"; public String secret="*********************"; public String yzmcode(String code,String telnum) throws ApiException, JSONException { TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret); AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest(); req.setExtend( "extend" ); req.setSmsType( "normal" ); req.setSmsFreeSignName( "*************" ); req.setSmsParamString( "{code:'"+code+"'}" ); req.setRecNum(telnum); req.setSmsTemplateCode( "******************" ); AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req); return "true"; }} 3.登入验证,并将权限保存在token,以下有token工具类,可直接copy使用
public ResultVo login(String phone, String code, HttpServletResponse response, HttpServletRequest request){ ValueOperations ops = redisTemplate.opsForValue(); String validcode = ops.get(phone); String outtimes=ops.get(phone+"wrong"); Integer ots=outtimes==null?0:Integer.valueOf(outtimes); if (ots>5){ return ResultVOUtil.erro(0,"错误次数过多,请稍后再试"); } if (validcode!=null){ String vcode=validcode.toString(); if (code.equalsIgnoreCase(vcode)){ Account account = accountService.findByUserName(phone); if (account!=null){ //记录登入信息,获取权限,字符串类型a,b,c,d String token = TokenUtils.tokenGet(phone, account.getDbids()); Loglogin loglogin=new Loglogin(); loglogin.setActionid(200); loglogin.setUserip(request.getRemoteAddr()); loglogin.setUsername(phone); loglogin.setLogtime(Timestamp.valueOf(TimeUtil.getCurDate())); loglogin.setUserid(account.getUserId()); logloginService.save(loglogin); 设置token时效 ops.set(phone+"token",token,60,TimeUnit.MINUTES); return ResultVOUtil.success(token); }else { return ResultVOUtil.erro(0,"没有此账户"); } }else { ops.set(phone+"wrong",String.valueOf(ots+1),5,TimeUnit.MINUTES); return ResultVOUtil.erro(0,"验证码错误"); } }else { return ResultVOUtil.erro(0,"请先获取验证码"); } }//token工具类public class TokenUtils { public static String tokenGet(String username,String limits){ Map map=new HashMap<>(); map.put("alg","HS256"); map.put("typ","JWT"); try { Algorithm algorithm=Algorithm.HMAC256("*******"); String token = JWT.create() .withHeader(map) /*设置 载荷 Payload*/ .withClaim("loginName", username) .withClaim("limits",limits) //设置过期时间-->间隔一定时间验证是否本人登入 .withExpiresAt(new Date(System.currentTimeMillis()+3600000*5)) .withIssuer("****")//签名是有谁生成 例如 服务器 .withSubject("*****")//签名的主题 .withAudience("*****")//签名的观众 也可以理解谁接受签名的 /*签名 Signature */ .sign(algorithm); return token; }catch (Exception e){ e.printStackTrace(); } return null; } public static String validToken(String token, String dbid){ try { Algorithm algorithm = Algorithm.HMAC256("*******"); JWTVerifier verifier = JWT.require(algorithm) .withIssuer("SERVICE") .build(); DecodedJWT jwt = verifier.verify(token); String subject = jwt.getSubject(); List audience = jwt.getAudience(); Map claims = jwt.getClaims(); Claim limits = claims.get("limits"); //验证操作权限,set长度改变说明权限不一致 String ss = limits.asString(); String[] split = ss.split(","); Set set=new HashSet<>(Arrays.asList(split)); int size = set.size(); set.add(dbid); if (set.size()!=size){ return null; }else { Claim name = claims.get("loginName"); return name.asString(); } }catch (Exception e){ e.printStackTrace(); } return null; } 4.接下来都比较简单
4.1获取数据-->前端传参数,后台验证即可,
4.2退出的时候,清除redis里的token数据即可,
感谢各位的阅读!关于"SpringBoot下如何实现token短信验证登入登出权限操作"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
验证
短信
权限
次数
工具
时间
接口
用户
错误
参考
限制
信息
内容
官方
数据
文档
更多
服务器
稍后
篇文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
支付宝线下服务器在哪
专注软件开发平台
保定网络技术厂家报价
道畅管理软件开发面试题
网络安全技术人员为什么不能露脸
服务器光纤断了怎么办
如何制作土豆服务器
大连网络安全与信息化研究院
系统私信功能 的数据库
mfc线程一直更新数据库
广州期货软件开发源代码
关于网络安全的黑板报资料
saas数据库架构方案
不动产登记 数据库
数据库新建一个表并添加索引
通州区网络安全中心
通讯管理服务器
湖州好的软件开发平台
中聚互联网络科技
乌镇互联网大会2018新科技
四大非关系型数据库比较
服务器在省外
目前主流服务器有哪些
材料网数据库
数据库blob用法
数据库日志库的意义
查询不同数据库的数据库
全国计算机网络技术题库
还原数据库用什么软件
上海银行软件开发岗年薪