日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

若依框架深度学习

發(fā)布時(shí)間:2023/12/10 pytorch 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 若依框架深度学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

登錄模塊

驗(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ù)信息

http://localhost/dev-api/login

參數(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()方法

/*** 用戶驗(yàn)證處理** @author ruoyi*/ @Service public class UserDetailsServiceImpl implements UserDetailsService {private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);@Autowiredprivate ISysUserService userService;@Autowiredprivate SysPermissionService permissionService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{SysUser user = userService.selectUserByUserName(username);if (StringUtils.isNull(user)){log.info("登錄用戶:{} 不存在.", username);throw new ServiceException("登錄用戶:" + username + " 不存在");}else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())){log.info("登錄用戶:{} 已被刪除.", username);throw new ServiceException("對不起,您的賬號:" + username + " 已被刪除");}else if (UserStatus.DISABLE.getCode().equals(user.getStatus())){log.info("登錄用戶:{} 已被停用.", username);throw new ServiceException("對不起,您的賬號:" + username + " 已停用");}return createLoginUser(user);}public UserDetails createLoginUser(SysUser user){return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));} }

通過用戶名查詢出來用戶,在通過我們傳入的密碼進(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é)

以上是生活随笔為你收集整理的若依框架深度学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。