SpringBoot下如何实现token短信验证登入登出权限操作
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章给大家分享的是有关SpringBoot下如何实现token短信验证登入登出权限操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SpringBoot下token短信
千家信息网最后更新 2025年01月20日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,"未注册用户"); }ValueOperationsops = 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){ ValueOperationsops = 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安全错误
数据库的锁怎样保障安全
用命令行窗口能设计数据库吗
外来人员网络安全检查表
从大学生视角谈网络安全论文
佛山精工软件开发
企业做软件开发需要什么资质
观看国家网络安全心得体会
a3纸网络安全手抄报小学
有关 的数据库
myserver空间数据库
c 软件开发简历
长沙商城软件开发费用
户政网络安全应急演练的通知
汽车网络技术的发展方向
软件开发方案设计范文下载
无锡软件开发工资怎么样
软件开发费税点是多少
面试软件开发财务
网络安全校园公益主题海报漫画
北京众淘互联网络科技有限公司
sql数据库会自动备份吗
汇通互联网软件开发有限公司
安卓识别二维码上传自定义服务器
苹果手机手动网络安全性
互联网类高科技公司
计算机网络技术基础名词互译
数据库技术知识大全
被取代的服务器
阿里云的数据库锁定
南阳微信公众号网络安全
秦皇岛软件开发参考价