千家信息网

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,"未注册用户"); }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安全错误 数据库的锁怎样保障安全 用命令行窗口能设计数据库吗 外来人员网络安全检查表 从大学生视角谈网络安全论文 佛山精工软件开发 企业做软件开发需要什么资质 观看国家网络安全心得体会 a3纸网络安全手抄报小学 有关 的数据库 myserver空间数据库 c 软件开发简历 长沙商城软件开发费用 户政网络安全应急演练的通知 汽车网络技术的发展方向 软件开发方案设计范文下载 无锡软件开发工资怎么样 软件开发费税点是多少 面试软件开发财务 网络安全校园公益主题海报漫画 北京众淘互联网络科技有限公司 sql数据库会自动备份吗 汇通互联网软件开发有限公司 安卓识别二维码上传自定义服务器 苹果手机手动网络安全性 互联网类高科技公司 计算机网络技术基础名词互译 数据库技术知识大全 被取代的服务器 阿里云的数据库锁定 南阳微信公众号网络安全 秦皇岛软件开发参考价
0