SpringBoot下token短信验证登入登出权限操作(token存放redis,ali短信接口)

 更新时间:2019年11月12日 10:25:30   作者:Supper波  
这篇文章主要介绍了SpringBoot下token短信验证登入登出权限操作(token存放redis,ali短信接口),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

SpringBoot下token短信验证登入登出(token存放redis)

不对SpringBoot进行介绍,具体的可以参考官方文档

介绍:token基本使用,redis基本使用

思路:获取短信(验证并限制发送次数,将code存放redis)-->登入(验证并限制错误次数,将用户信息及权限放token,token放redis)-->查询操作(略),主要将前两点,不足的希望指出,谢谢

步骤:

1.整合Redis需要的依赖,yml自行配置,ali短信接口依赖(使用引入外部包的方式)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>ali</groupId>
  <artifactId>taobao-sdk-java-auto</artifactId>
  <scope>system</scope>
  <!--将jar包放在项目/libs/xxx.jar-->
  <systemPath>${project.basedir}/libs/taobao-sdk-java-auto.jar</systemPath>
</dependency>
.......
<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <!--打包的时候引用该属性的包-->
          <includeSystemScope>true</includeSystemScope>
        </configuration>
      </plugin>
    </plugins>
  </build>

2.ali短信接口工具类,发送验证码

@Autowired
  private StringRedisTemplate redisTemplate;
....略....
//查询是否有此用户,记录单位时间内发送短信次数,并限制发送次数
Account account = accountService.findByUserName(phone);
if (account==null){
 return ResultVOUtil.erro(0,"未注册用户");
 }
ValueOperations<String, String> 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<String, String> 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<String,Object> 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<String> audience = jwt.getAudience();
      Map<String, Claim> claims = jwt.getClaims();
      Claim limits = claims.get("limits");
      //验证操作权限,set长度改变说明权限不一致
      String ss = limits.asString();
      String[] split = ss.split(",");
      Set<String> 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数据即可,

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java构造函数的相互调用代码示例

    Java构造函数的相互调用代码示例

    这篇文章主要介绍了Java构造函数的相互调用代码示例,分享了两段代码示例,通过this关键字实现对的构造函数的调用,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Spring Boot 2.X快速整合jpa过程解析

    Spring Boot 2.X快速整合jpa过程解析

    这篇文章主要介绍了Spring Boot 2.X 如何快速整合jpa?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 在SpringBoot中整合使用Netty框架的详细教程

    在SpringBoot中整合使用Netty框架的详细教程

    这篇文章主要介绍了在SpringBoot中整合使用Netty框架的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • SpringMVC请求的路径变量里面写正则表达式的方法

    SpringMVC请求的路径变量里面写正则表达式的方法

    这篇文章主要介绍了SpringMVC请求的路径变量里面写正则表达式的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • SpringBoot调用第三方接口的几种方式小结

    SpringBoot调用第三方接口的几种方式小结

    在项目中调用第三方接口时,确实需要根据项目的技术栈、架构规范以及具体的业务需求来选择最适合的调用方式,下面我们就介绍几种调用第三方接口的实现方式以及代码示例,需要的朋友可以参考下
    2024-07-07
  • Spring Boot的properties配置文件读取

    Spring Boot的properties配置文件读取

    这篇文章主要介绍了Spring Boot的properties配置文件读取,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java并发编程包中atomic的实现原理示例详解

    Java并发编程包中atomic的实现原理示例详解

    这篇文章主要给大家介绍了关于Java并发编程包中atomic的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Spring MVC请求参数的深入解析

    Spring MVC请求参数的深入解析

    这篇文章主要给大家介绍了关于Spring MVC请求参数解析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 基于spring三方包类注入容器的四种方式小结

    基于spring三方包类注入容器的四种方式小结

    这篇文章主要介绍了基于spring三方包类注入容器的四种方式小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java开发之Spring连接数据库方法实例分析

    Java开发之Spring连接数据库方法实例分析

    这篇文章主要介绍了Java开发之Spring连接数据库方法,以实例形式较为详细的分析了Java Spring开发中针对数据库的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10

最新评论