ruoyi源码学习-3 登录后端接口

前言

经过之前两期,我们理解了ruoyi前端登录页面的流程。这期,我们开始分析后端对应的流程。主要分析获取验证码接口captchaImage和登录接口login

若依后端结构

首先我们看一下ruoyi后端的模块组成。

  • admin——web服务入口
  • common——通用工具
  • framework——核心模块
  • generator——代码生成
  • quartz——定时任务
  • system——系统模块

ruoyi后端中是将controller文件统一放入admin模块中。

验证码接口

对应文件位置为ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java

主要流程为:

  1. 生成随机的uuid
  2. 生成随机的验证码图片及结果
  3. 将uuid和验证码结果存入redis
  4. 将验证码图片放入返回值中
@GetMapping("/captchaImage")
// AjaxResult统一返回值
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
    // 保存验证码信息
  	// 使用加密的强伪随机数生成器生成该 UUID
    String uuid = IdUtils.simpleUUID();
    String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;

    String capStr = null, code = null;
    BufferedImage image = null;

    // 生成验证码
  	// application.yml中配置ruoyi.captchaType
  	// 数学模式
    if ("math".equals(captchaType))
    {
        String capText = captchaProducerMath.createText();
      	// 表达式
        capStr = capText.substring(0, capText.lastIndexOf("@"));
      	// 对应结果
        code = capText.substring(capText.lastIndexOf("@") + 1);
      	// 根据表达式生成图片BufferedImage
        image = captchaProducerMath.createImage(capStr);
    }
  	// 文本模式
    else if ("char".equals(captchaType))
    {
      	// 生成的表达式和结果相同
        capStr = code = captchaProducer.createText();
        image = captchaProducer.createImage(capStr);
    }
  	// 将uuid和验证码键值存入redis
    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());
    }

    AjaxResult ajax = AjaxResult.success();
    ajax.put("uuid", uuid);
  	// 转base64格式
    ajax.put("img", Base64.encode(os.toByteArray()));
    return ajax;
}
  1. ruoyi中默认的uuid生成为Version 4,有概率重复https://www.zhihu.com/question/34876910/answer/88924223
  2. ruoyi采用ThreadLocalRandom生成随机数,避免多线程竞争争夺
  3. ruoyi中提供了更安全的随机码生成,但会降低性能
登陆接口

对应文件位置为:ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
    AjaxResult ajax = AjaxResult.success();
    // 生成令牌
    String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
            loginBody.getUuid());
    ajax.put(Constants.TOKEN, token);
    return ajax;
}

上段代码可谈的不多,即生成token然后返回。

主要来看一下token的生成过程。这里为了方便大家查看,我去除了异常处理的代码。

public String login(String username, String password, String code, String uuid)
{
    String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
  	// 从redis中获取uuid对应验证码
    String captcha = redisCache.getCacheObject(verifyKey);
    redisCache.deleteObject(verifyKey);
  	// captcha为空异常
  	// code不等于captcha异常
  
    // 用户验证
    Authentication authentication = null;
 	 // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
  // 调用org.springframework.security验证
 		 authentication = authenticationManager
    .authenticate(new UsernamePasswordAuthenticationToken(username, password));
  	// 用户不存在或密码错误异常
  	// 其他异常
  // 异步记录登录信息
  AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
  	// 获取用户信息和权限
    LoginUser loginUser = (LoginUser) authentication.getPrincipal();
  	// 修改用户最后登录ip和时间
    recordLoginInfo(loginUser.getUser());
    // 生成token
    return tokenService.createToken(loginUser);
}
下期计划

用户登录后,默认进入/index页面。我们查看src/views/index.vue,发现多是静态内容。但进入此页面时,产生了两个请求getInfogetRouters。这两个请求是在第2篇—路由拦截跳转中准入限制router.beforeEach调用的。下期便首先分析getInfo.

  • 分析获取用户信息
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。您是否在找一套合适后台管理系统。您是否在找一套代码易读易懂后台管理系统。那么,现在若依来了。诚意奉献之作若依是给刚出生的女儿取的名字 寓意:你若不离不弃,我必生死相依内置功能用户管理:用户是系统操作者。部门管理:配置系统组织机构。岗位管理:岗位是用户所属职务。菜单管理:配置系统菜单(支持控制到按钮)。角色管理:角色菜单权限分配。字典管理:对系统中经常使用的一些较为固定的数据进行维护。操作日志:系统操作日志记录(含异常)。登录日志:系统登录情况记录(含异常)。在线用户:当前系统中活跃用户状态监控。连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。为何选择若依是一个完全响应式,基于Bootstrap3.3.6最新版本开发的主题。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。拥有良好的代码结构,层次结构清晰。内置一系列基础功能。操作权限控制精密细致,对所有管理链接都进行权限验证,可控制到按钮。提供在线功能代码生成工具,提高开发效率及质量。提供常用工具类封装,日志、国际化、缓存、验证、字典等数据。兼容目前最流行浏览器(IE7+、Chrome、Firefox)手机移动端也支持。技术选型1、后端核心框架:Spring Boot安全框架:Apache Shiro模板引擎:Thymeleaf持久层框架:MyBatis数据库连接池:Druid缓存框架:Ehcache日志管理:SLF4J工具类:Apache Commons FastjsonPOJO:Lombok2、前端框架:Bootstrap数据表格:Bootstrap Table客户端验证:JQuery Validation树结构控件:zTree弹出层:layer3、平台服务器中间件:SpringBoot内置数据库支持:目前仅提供MySql数据库的支持,但不限于数据库开发环境:Java、Eclipse、Maven、Git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值