真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot下如何實(shí)現(xiàn)token短信驗(yàn)證登入登出權(quán)限操作

這篇文章給大家分享的是有關(guān)SpringBoot下如何實(shí)現(xiàn)token短信驗(yàn)證登入登出權(quán)限操作的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)公司).為客戶提供專(zhuān)業(yè)的服務(wù)器托管,四川各地服務(wù)器托管,服務(wù)器托管、多線服務(wù)器托管.托管咨詢專(zhuān)線:18980820575

SpringBoot下token短信驗(yàn)證登入登出(token存放redis)

不對(duì)SpringBoot進(jìn)行介紹,具體的可以參考官方文檔

思路:獲取短信(驗(yàn)證并限制發(fā)送次數(shù),將code存放redis)-->登入(驗(yàn)證并限制錯(cuò)誤次數(shù),將用戶信息及權(quán)限放token,token放redis)-->查詢操作(略),主要將前兩點(diǎn),不足的希望指出,謝謝

步驟:

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短信接口工具類(lèi),發(fā)送驗(yàn)證碼

@Autowired
  private StringRedisTemplate redisTemplate;
....略....
//查詢是否有此用戶,記錄單位時(shí)間內(nèi)發(fā)送短信次數(shù),并限制發(fā)送次數(shù)
Account account = accountService.findByUserName(phone);
if (account==null){
 return ResultVOUtil.erro(0,"未注冊(cè)用戶");
 }
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,"獲取短信次數(shù)過(guò)多,請(qǐng)稍后再試");
}
ops.set(account+"code",String.valueOf(gts+1),5,TimeUnit.MINUTES);
NoteUtils noteUtils=new NoteUtils();
String validCode = UidUtil.getValidCode(); //生成隨機(jī)數(shù)
try {
 String yzmcode = noteUtils.yzmcode(validCode, phone);
  //redis設(shè)置驗(yàn)證碼有效時(shí)間5分組
 ops.set(phone,validCode,5,TimeUnit.MINUTES);
 }catch (Exception e){
   throw new YunExceptions(0,"獲取驗(yàn)證碼

3.登入驗(yàn)證,并將權(quán)限保存在token,以下有token工具類(lèi),可直接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,"錯(cuò)誤次數(shù)過(guò)多,請(qǐng)稍后再試");
    }
    if (validcode!=null){
      String vcode=validcode.toString();
      if (code.equalsIgnoreCase(vcode)){
        Account account = accountService.findByUserName(phone);
        if (account!=null){
          //記錄登入信息,獲取權(quán)限,字符串類(lèi)型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);
          設(shè)置token時(shí)效
          ops.set(phone+"token",token,60,TimeUnit.MINUTES);
          return ResultVOUtil.success(token);
        }else {
          return ResultVOUtil.erro(0,"沒(méi)有此賬戶");
        }
      }else {
        ops.set(phone+"wrong",String.valueOf(ots+1),5,TimeUnit.MINUTES);
        return ResultVOUtil.erro(0,"驗(yàn)證碼錯(cuò)誤");
      }
    }else {
      return ResultVOUtil.erro(0,"請(qǐng)先獲取驗(yàn)證碼");
    }
  }
//token工具類(lèi)
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)
          /*設(shè)置 載荷 Payload*/
          .withClaim("loginName", username)
          .withClaim("limits",limits)
          //設(shè)置過(guò)期時(shí)間-->間隔一定時(shí)間驗(yàn)證是否本人登入
          .withExpiresAt(new Date(System.currentTimeMillis()+3600000*5))
          .withIssuer("****")//簽名是有誰(shuí)生成 例如 服務(wù)器
          .withSubject("*****")//簽名的主題
          .withAudience("*****")//簽名的觀眾 也可以理解誰(shuí)接受簽名的
          /*簽名 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");
      //驗(yàn)證操作權(quán)限,set長(zhǎng)度改變說(shuō)明權(quán)限不一致
      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.接下來(lái)都比較簡(jiǎn)單

4.1獲取數(shù)據(jù)-->前端傳參數(shù),后臺(tái)驗(yàn)證即可,

4.2退出的時(shí)候,清除redis里的token數(shù)據(jù)即可,

感謝各位的閱讀!關(guān)于“SpringBoot下如何實(shí)現(xiàn)token短信驗(yàn)證登入登出權(quán)限操作”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


本文標(biāo)題:SpringBoot下如何實(shí)現(xiàn)token短信驗(yàn)證登入登出權(quán)限操作
標(biāo)題來(lái)源:
http://weahome.cn/article/poihds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部