SpringBoot下token短信驗(yàn)證登入登出權(quán)限操作(token存放redis,ali短信接口)
SpringBoot下token短信驗(yàn)證登入登出(token存放redis)
不對(duì)SpringBoot進(jìn)行介紹,具體的可以參考官方文檔
介紹:token基本使用,redis基本使用
思路:獲取短信(驗(yàn)證并限制發(fā)送次數(shù),將code存放redis)-->登入(驗(yàn)證并限制錯(cuò)誤次數(shù),將用戶信息及權(quán)限放token,token放redis)-->查詢操作(略),主要將前兩點(diǎn),不足的希望指出,謝謝
步驟:
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包放在項(xiàng)目/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> <!--打包的時(shí)候引用該屬性的包--> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins> </build>
2.ali短信接口工具類,發(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,"未注冊用戶"); } 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,"獲取短信次數(shù)過多,請稍后再試"); } 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)證碼服務(wù)器bug"); } //短信接口工具類 public class NoteUtils { //僅當(dāng)示例:具體參考官方文檔 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.登入驗(yàn)證,并將權(quán)限保存在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,"錯(cuò)誤次數(shù)過多,請稍后再試"); } if (validcode!=null){ String vcode=validcode.toString(); if (code.equalsIgnoreCase(vcode)){ Account account = accountService.findByUserName(phone); if (account!=null){ //記錄登入信息,獲取權(quán)限,字符串類型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,"沒有此賬戶"); } }else { ops.set(phone+"wrong",String.valueOf(ots+1),5,TimeUnit.MINUTES); return ResultVOUtil.erro(0,"驗(yàn)證碼錯(cuò)誤"); } }else { return ResultVOUtil.erro(0,"請先獲取驗(yàn)證碼"); } } //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) /*設(shè)置 載荷 Payload*/ .withClaim("loginName", username) .withClaim("limits",limits) //設(shè)置過期時(shí)間-->間隔一定時(shí)間驗(yàn)證是否本人登入 .withExpiresAt(new Date(System.currentTimeMillis()+3600000*5)) .withIssuer("****")//簽名是有誰生成 例如 服務(wù)器 .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"); //驗(yàn)證操作權(quán)限,set長度改變說明權(quán)限不一致 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獲取數(shù)據(jù)-->前端傳參數(shù),后臺(tái)驗(yàn)證即可,
4.2退出的時(shí)候,清除redis里的token數(shù)據(jù)即可,
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Ribbon負(fù)載均衡服務(wù)調(diào)用的示例詳解
Rbbo其實(shí)就是一個(gè)軟負(fù)載均衡的客戶端組件,他可以和其他所需請求的客戶端結(jié)合使用,這篇文章主要介紹了Ribbon負(fù)載均衡服務(wù)調(diào)用案例代碼,需要的朋友可以參考下2023-01-01ANSI,Unicode,BMP,UTF等編碼概念實(shí)例講解
這篇文章主要介紹了ANSI,Unicode,BMP,UTF等編碼概念實(shí)例講解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12Java利用Hutool-Script封裝JS腳本執(zhí)行
在?Java?開發(fā)中,有時(shí)需要?jiǎng)討B(tài)執(zhí)行腳本代碼,比如?JavaScript?腳本,來實(shí)現(xiàn)一些靈活的業(yè)務(wù)邏輯,下面我們就來看看如何利用Hutool-Script模塊對(duì)Java的腳本執(zhí)行功能進(jìn)行封裝吧2025-02-02- 數(shù)組和二維數(shù)組感覺用王者榮耀的裝備欄來舉例解釋,應(yīng)該更易懂一些。從基礎(chǔ)開始講,后續(xù)會(huì)講到JAVA高級(jí),中間會(huì)穿插面試題和項(xiàng)目實(shí)戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
springboot應(yīng)用服務(wù)啟動(dòng)事件的監(jiān)聽實(shí)現(xiàn)
本文主要介紹了springboot應(yīng)用服務(wù)啟動(dòng)事件的監(jiān)聽實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04如何運(yùn)行SpringBoot項(xiàng)目的方法
這篇文章主要介紹了如何運(yùn)行SpringBoot項(xiàng)目的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03最新評(píng)論