若依框架深度学习
登錄模塊
驗(yàn)證碼
采用的base64加密處理,我們通過響應(yīng)結(jié)果查看驗(yàn)證碼圖片是我們需要加上
登錄模塊
驗(yàn)證碼
采用的base64加密處理,我們通過響應(yīng)結(jié)果查看驗(yàn)證碼圖片是我們需要加上
data:image/png;base64,才能看見效果,具體如下
data:image/png;base64,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驗(yàn)證碼實(shí)在后臺生成的,我們會(huì)驗(yàn)證碼的生成信息以及結(jié)果存儲到redis緩存中,在保存驗(yàn)證碼信息的時(shí)候,會(huì)給它加上一個(gè)uuid
/*** 驗(yàn)證碼 redis key*/public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; // 保存驗(yàn)證碼信息String uuid = IdUtils.simpleUUID();String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;驗(yàn)證碼后臺生成并且存入redis
String capText = captchaProducerMath.createText();capStr = capText.substring(0, capText.lastIndexOf("@"));code = capText.substring(capText.lastIndexOf("@") + 1);redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);最后將生成的驗(yàn)證碼信息通過流傳給前端,并且進(jìn)行對圖片進(jìn)行了加密處理
FastByteArrayOutputStream os = new FastByteArrayOutputStream();try{ImageIO.write(image, "jpg", os);}catch (IOException e){return AjaxResult.error(e.getMessage());}ajax.put("uuid", uuid);ajax.put("img", Base64.encode(os.toByteArray()));驗(yàn)證碼生成之后,前臺會(huì)接收到一個(gè)圖片的信息和uuid,當(dāng)我們講用戶名和密碼填寫好了之后我們會(huì)根據(jù)uuidredis中找到鍵根然后獲取對應(yīng)的緩存中驗(yàn)證碼的值,進(jìn)行對比看看是否正確,具體流程圖如下:
具體的登錄邏輯的實(shí)現(xiàn)我們可以通過前端發(fā)起的請求地址找到,也可以看見前端傳過來的具體參數(shù)信息
參數(shù)信息
{username: "admin", password: "admin123", code: "3", uuid: "dcb06362103d4f3889ff171c95787779"} code: "3" password: "admin123" username: "admin" uuid: "dcb06362103d4f3889ff171c95787779"因?yàn)檫@個(gè)認(rèn)證部分是使用springSecurity來做的首先會(huì)通過authenticate該方法會(huì)去調(diào)用UserDetailsServiceImpl.loadUserByUsername,最后若依后臺重寫了loadUserByUsername這個(gè)方法,最后通過用戶名去數(shù)據(jù)庫中進(jìn)行查詢,并返回響應(yīng)結(jié)果
// 該方法會(huì)去調(diào)用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));通過debug主要調(diào)用過程如下
最后若依框架重寫了UserDetailsService.loadUserByUsername()方法
通過用戶名查詢出來用戶,在通過我們傳入的密碼進(jìn)行比對,具體邏輯如下
protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {if (authentication.getCredentials() == null) {this.logger.debug("Failed to authenticate since no credentials provided");throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));} else {String presentedPassword = authentication.getCredentials().toString();if (!this.passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {this.logger.debug("Failed to authenticate since password does not match stored value");throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));}}}最后返回前端登錄信息成功與否的結(jié)果
總結(jié)
- 上一篇: JavaScrpt --- es5实现
- 下一篇: app开发人脸登录和指纹登录_易讯云通讯