若依框架深度学习

登录模块

验证码

采用的base64加密处理,我们通过响应结果查看验证码图片是我们需要加上
登录模块
验证码
采用的base64加密处理,我们通过响应结果查看验证码图片是我们需要加上

data:image/png;base64,才能看见效果,具体如下

data:image/png;base64,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

验证码实在后台生成的,我们会验证码的生成信息以及结果存储到redis缓存中,在保存验证码信息的时候,会给它加上一个uuid

 /**
     * 验证码 redis key
     */
    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
  // 保存验证码信息
        String uuid = IdUtils.simpleUUID();
        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;

验证码后台生成并且存入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);

最后将生成的验证码信息通过流传给前端,并且进行对图片进行了加密处理

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()));

验证码生成之后,前台会接收到一个图片的信息和uuid,当我们讲用户名和密码填写好了之后我们会根据uuidredis中找到键根然后获取对应的缓存中验证码的值,进行对比看看是否正确,具体流程图如下:
在这里插入图片描述
具体的登录逻辑的实现我们可以通过前端发起的请求地址找到,也可以看见前端传过来的具体参数信息

http://localhost/dev-api/login

参数信息

{username: "admin", password: "admin123", code: "3", uuid: "dcb06362103d4f3889ff171c95787779"}
code: "3"
password: "admin123"
username: "admin"
uuid: "dcb06362103d4f3889ff171c95787779"

因为这个认证部分是使用springSecurity来做的首先会通过authenticate该方法会去调用UserDetailsServiceImpl.loadUserByUsername,最后若依后台重写了loadUserByUsername这个方法,最后通过用户名去数据库中进行查询,并返回响应结果

   // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager
                    .authenticate(new UsernamePasswordAuthenticationToken(username, password));

通过debug主要调用过程如下
在这里插入图片描述
最后若依框架重写了UserDetailsService.loadUserByUsername()方法

/**
 * 用户验证处理
 *
 * @author ruoyi
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService
{
    private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);

    @Autowired
    private ISysUserService userService;

    @Autowired
    private SysPermissionService permissionService;

    @Override
    public 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));
    }
}

通过用户名查询出来用户,在通过我们传入的密码进行比对,具体逻辑如下

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"));
            }
        }
    }

最后返回前端登录信息成功与否的结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值