由于使用若依后台管理系统需要匹配其它平台使用同一套数据库,故需要有相同的加密解密方式,下面分享使用手机号+密码登录且加密解密方式为AES的实现代码。
总体的实现思路是先将若依设置为免密登录,即不使用若依自带的加密解密方式,然后再加入AES方式


修改身份认证接口

在SecurityConfig.java文件中找到身份认证接口函数做下述修改

    /*** 身份认证接口*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception{//添加自己的身份验证类,userDetailsService这个可以自己在重新定义根据那个字段验证用户存在与否auth.authenticationProvider(new CustomLoginAuthenticationProvider(userDetailsService));auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());}

SysLoginController.java

这里重新链接一下要使用的登录验证函数

    @Autowiredprivate ILoginService LoginService;/*** 登录方法* * @param loginBody 登录信息* @return 结果* @throws Exception */@PostMapping("/login")public AjaxResult login(@RequestBody LoginBody loginBody) throws Exception{AjaxResult ajax = AjaxResult.success();
//注意此处调用了LoginService.loginByMobile,需要自己添加String token = LoginService.loginByMobile(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),loginBody.getUuid());ajax.put(Constants.TOKEN, token);return ajax;}

ILoginService.java

package com.ruoyi.framework.web.service;/*** @DESCRIPTION 手机号关于登录接口* @author cy* @date 2021-11-3 19:56*/
public interface ILoginService {String loginByMobile(String username, String password, String code, String uuid) throws Exception;}

LoginServiceImpl.java

此文件是实现的关键

package com.ruoyi.framework.web.service;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.controller.tool.AESForNodejs;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;import javax.annotation.Resource;/*** @description: 手机号关于登录接口* @author: cy* @date: 2021-11-03 20:12*/
@Service
public class LoginServiceImpl implements ILoginService {private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);@Autowiredprivate TokenService tokenService;@Resourceprivate AuthenticationManager authenticationManager;@Autowiredprivate ISysUserService userService;@Autowiredprivate RedisCache redisCache;/*** 免密常量*/public static final String CUSTOM_LOGIN_SMS = "CUSTOM_LOGIN_SMS";/*** @Description 手机号+密码登录* @author cy* @date 2021-11-03 20:32* @return java.lang.String* @throws Exception */public String loginByMobile(String account, String password, String code, String uuid) throws Exception{String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;String captcha = redisCache.getCacheObject(verifyKey);redisCache.deleteObject(verifyKey);//校验验证码是否正确if (captcha == null){AsyncManager.me().execute(AsyncFactory.recordLogininfor(account, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));throw new CaptchaExpireException();}if (!code.equalsIgnoreCase(captcha)){AsyncManager.me().execute(AsyncFactory.recordLogininfor(account, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));throw new CaptchaException();}//通过手机号或许数据库中储存的用户信息SysUser user = userService.selectUserByAccount(account);   if (StringUtils.isNull(user)){log.info("登录用户:{} 不存在.", account);return loginVerify(account,Constants.LOGIN_FAIL);}//解密,判断与数据库中储存的密码是否相同,此处使用AES进行加密解密String db_password = AESForNodejs.decrypt(user.getPassword());if(!db_password.equals(password)) {log.info("登录用户:{} 密码错误.", account);return loginVerify(account,Constants.LOGIN_FAIL);}//TODO 2、用户验证return loginVerify(account,Constants.CUSTOM_LOGIN_SMS);}/*** @Description 登录验证* @author cy* @date 2021-11-03 20:45* @param userName 用户名* @param passWord 密码* @return java.lang.String*/private String loginVerify(String userName,String passWord) {//TODO 1、用户验证Authentication authentication = null;try {//TODO 1.1该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(userName, passWord));} catch (Exception e) {if (e instanceof BadCredentialsException) {AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();} else {AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_FAIL, e.getMessage()));throw new CustomException(e.getMessage());}}AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();//TODO 2、生成tokenreturn tokenService.createToken(loginUser);}}

①由于在LoginServiceImpl.java文件中定义了免密常量,所以需要在Constants文件中增加免密常量

    /*** 免密常量*/public static final String CUSTOM_LOGIN_SMS = "CUSTOM_LOGIN_SMS";

②由于在LoginServiceImpl.java文件中使用了自定义的AES解密方式,所以需要定义该类

AESForNodejs.java

package com.ruoyi.web.controller.tool;import java.security.MessageDigest;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;/*** AES加密,与Nodejs 保持一致* @author lmiky* @date 2014-2-25*/
public class AESForNodejs {public static final String DEFAULT_CODING = "utf-8";/*** 解密* @author lmiky* @date 2014-2-25* @param encrypted* @param seed* @return* @throws Exception*/public static String decrypt(String encrypted) throws Exception {String seed = "1234567887654321";byte[] keyb = seed.getBytes(DEFAULT_CODING);MessageDigest md = MessageDigest.getInstance("MD5");byte[] thedigest = md.digest(keyb);SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");Cipher dcipher = Cipher.getInstance("AES");dcipher.init(Cipher.DECRYPT_MODE, skey);byte[] clearbyte = dcipher.doFinal(toByte(encrypted));return new String(clearbyte);}/*** 加密* @author lmiky* @date 2014-2-25* @param content* @param key* @return* @throws Exception*/public static String encrypt(String content) throws Exception {String key = "1234567887654321";byte[] input = content.getBytes(DEFAULT_CODING);MessageDigest md = MessageDigest.getInstance("MD5");byte[] thedigest = md.digest(key.getBytes(DEFAULT_CODING));SecretKeySpec skc = new SecretKeySpec(thedigest, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, skc);byte[] cipherText = new byte[cipher.getOutputSize(input.length)];int ctLength = cipher.update(input, 0, input.length, cipherText, 0);ctLength += cipher.doFinal(cipherText, ctLength);return parseByte2HexStr(cipherText);}/*** 字符串转字节数组* @author lmiky* @date 2014-2-25* @param hexString* @return*/private static byte[] toByte(String hexString) {int len = hexString.length() / 2;byte[] result = new byte[len];for (int i = 0; i < len; i++) {result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();}return result;}/*** 字节转16进制数组* @author lmiky* @date 2014-2-25* @param buf* @return*/private static String parseByte2HexStr(byte buf[]) {StringBuffer sb = new StringBuffer();for (int i = 0; i < buf.length; i++) {String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex);}return sb.toString();}
}

如此输入手机号+密码便可以实现特定方式的加密解密登录!

若依项目实现手机号+密码登录且密码验证为自定义加密方式相关推荐

  1. Vue项目中实现用户登录及token验证

    一.什么是token token的意思是"令牌",是服务端生成的一串字符串,作为客户端进行请求的一个标识.当用户第一次登录后,服务器生成一个token并将此token返回给客户端, ...

  2. Uni-app 手机号+验证码登录 用户名密码登录登出

    用户名密码登录,手机号登录 用户名密码登录:用了uniapp+uview的$u.debounce防抖方法,再发送请求 判断正则以及同意条款勾选后,发起登录请求(参数是用户名和密码),如果请求成功--s ...

  3. vue 用户名重复验证_Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1.第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个to ...

  4. wegame每次登陆都要滑动验证_Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1.第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个to ...

  5. linux 查明文密码,登录页面密码支持明文查看

    好多APP登录页面为了查看自己输入密码是否正确都添加了明文查看的方法,也就是所谓的小眼睛,把小眼睛的代码分享给大家. Activity: //声明id: private EditText etUser ...

  6. vue项目中实现用户登录以及token验证

    文章目录 前言 一.总体逻辑图 二.各环节涉及知识点以及代码 1.jwt(这里只说用法,至于为什么用它,详细可查官网) 2.返回token并存入vuex做持久化 3.路由守卫 4.axios请求拦截 ...

  7. python凯撒密码加密写入文件_Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作...

    #-*- coding: gb2312 -*-#用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作#作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/k ...

  8. Linux SSH免密码登录

    转载请注明出处:http://www.cnblogs.com/blazer/p/5165304.html 环境:CentOS6.4 一.概述 1.为了让两个linux机器之间使用ssh不需要用户名和密 ...

  9. SSH协议及免密码登录

    一.简述 SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露. 二.公钥加密 ( ...

最新文章

  1. 基于Opencv实现眼睛控制鼠标
  2. 【通信原理】【实验】实验二:数字基带传输实验(GZHU)
  3. PHP分页的limit与offset
  4. python能做出exe程序么_教你用python做exe程序
  5. Androidの多线程之更新ui(Thread+Handler+Message)
  6. 高性能动态编译库Natasha发布1.0版本!
  7. 登录系统_执照管理系统登录与执照转换操作指南
  8. 一个低时延高吞吐的日志方案设计-2021年6月4日
  9. java 使用 com.thoughtworks.xstream.XStream 将map转为xml
  10. Python——数组(列表)的基本操作
  11. IDC:2017年全球公有云服务开支将达1225亿美元
  12. MooseFs的使用与操作
  13. 抓考研英语单词主要矛盾的经验分享,考研英语真题词频统计
  14. Set和Map数据结构。
  15. nohup java -jar 命令启动jar包,项目仍然会莫名其妙挂掉的解决方法
  16. FAST-LIO2代码解析(一)
  17. 不看会后悔的100个超有趣冷知识(一)
  18. 面试时如何回答面试官的问题
  19. 房屋出租系统(初级)
  20. 漂洋过海,与Splunk第一次近距离接触!

热门文章

  1. 软件测试基础——概念篇
  2. Linux究竟值多少钱?
  3. 基于语法分析的公式分析器设计
  4. java基础,带参的方法进行客户姓名排序
  5. 《孙子兵法》中的企业领导艺术和方法
  6. python实现凯撒密码加密与解密(暴力求解)
  7. 获取上传文件的后缀,.jpg,.png,.word,.xsl...使用方法split,lastindexOf,subtr
  8. 海康威视官方安装包(提供64位安装包)
  9. 登录显示服务器端校验不通过,SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.7.57 SMTP;...
  10. ios android 联机游戏平台,iOS 和安卓游戏终于互通了