RuoYi-Cloud-Plus 登录过程源码

这篇具有很好参考价值的文章主要介绍了RuoYi-Cloud-Plus 登录过程源码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

登录界面

RuoYi-Cloud-Plus 登录过程源码

ruoyi-ui/src/views/login.vue

点击登录按钮进入handleLogin方法
RuoYi-Cloud-Plus 登录过程源码

     handleLogin() {
      //验证数据是否合法
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true;
          //如果记住密码被勾选
          if (this.loginForm.rememberMe) {
            //直接在cookie中存入相关信息,过期时间为30天
            Cookies.set("username", this.loginForm.username, { expires: 30 });
            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
          } else {
            Cookies.remove("username");
            Cookies.remove("password");
            Cookies.remove('rememberMe');
          }
          //调用vuex中的action
          this.$store.dispatch("Login", this.loginForm).then(() => {
            //登录成功后,直接访问主界面
            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
          }).catch(() => {
            this.loading = false;
            //登录失败,重新生成验证码
            if (this.captchaEnabled) {
              this.getCode();
            }
          });
        }
      });
    }

loginForm

data() {
    return {
      codeUrl: "",
      loginForm: {
        username: "admin",
        password: "admin123",
        rememberMe: false,
        code: "",
        uuid: ""
      },
      loginRules: {
        username: [
          { required: true, trigger: "blur", message: "请输入您的账号" }
        ],
        password: [
          { required: true, trigger: "blur", message: "请输入您的密码" }
        ],
        code: [{ required: true, trigger: "change", message: "请输入验证码" }]
      },
      loading: false,
      // 验证码开关
      captchaEnabled: true,
      // 注册开关
      register: false,
      redirect: undefined
    };
  },

actions中的Login方法

// 登录
    Login({ commit }, userInfo) {
      //将loginForm的值传递过来做赋值
      const username = userInfo.username.trim()
      const password = userInfo.password
      const code = userInfo.code
      const uuid = userInfo.uuid
      return new Promise((resolve, reject) => {
        //调用具体的login方法,对象传到后端
        login(username, password, code, uuid).then(res => {
          //用户登录成功后保存用户的登录状态,
          let data = res.data
          //保存token以及过期时间,调用auth.js中的具体的function给当前cookies存放token以及过期时间的
          //把token存入cookies,调用了auth.js中的setToken
          setToken(data.access_token)
          //触发mutations,把token存入state
          commit('SET_TOKEN', data.access_token)
          setExpiresIn(data.expires_in)
          commit('SET_EXPIRES_IN', data.expires_in)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },

后端登录
src/main/java/com/ruoyi/auth/controller/TokenController.java

 private final SysLoginService sysLoginService;

    /**
     * 登录方法
     */
    @PostMapping("login")
    public R<Map<String, Object>> login(@Validated @RequestBody LoginBody form) {
        // 用户登录
        String accessToken = sysLoginService.login(form.getUsername(), form.getPassword());
        // 接口返回信息
        Map<String, Object> rspMap = new HashMap<>();
        rspMap.put(Constants.ACCESS_TOKEN, accessToken);
        return R.ok(rspMap);
    }

src/main/java/com/ruoyi/auth/service/SysLoginService.java

    @DubboReference
    private RemoteLogService remoteLogService;
    @DubboReference
    private RemoteUserService remoteUserService;

    @Autowired
    private UserPasswordProperties userPasswordProperties;

    /**
     * 登录
     */
    public String login(String username, String password) {
        //通过用户名得到用户实体类
        LoginUser userInfo = remoteUserService.getUserInfo(username);
        //密码校验,登录次数判断
        //BCrypt.checkpw验证密码是否正确
        checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, userInfo.getPassword()));
        // 获取登录token
        LoginHelper.loginByDevice(userInfo, DeviceType.PC);

        recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
        return StpUtil.getTokenValue();
    }

远程调用src/main/java/com/ruoyi/system/api/RemoteUserService.java

/**
 * 用户服务
 *
 * @author Lion Li
 */
public interface RemoteUserService {

    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @return 结果
     */
    LoginUser getUserInfo(String username) throws UserException;

    /**
     * 通过手机号查询用户信息
     *
     * @param phonenumber 手机号
     * @return 结果
     */
    LoginUser getUserInfoByPhonenumber(String phonenumber) throws UserException;

    /**
     * 通过openid查询用户信息
     *
     * @param openid openid
     * @return 结果
     */
    XcxLoginUser getUserInfoByOpenid(String openid) throws UserException;

    /**
     * 注册用户信息
     *
     * @param sysUser 用户信息
     * @return 结果
     */
    Boolean registerUserInfo(SysUser sysUser);

    /**
     * 通过userId查询用户账户
     *
     * @param userId 用户id
     * @return 结果
     */
    String selectUserNameById(Long userId);
}

登录类型src/main/java/com/ruoyi/common/core/enums/LoginType.java

/**
 * 登录类型
 *
 * @author Lion Li
 */
@Getter
@AllArgsConstructor
public enum LoginType {

    /**
     * 密码登录
     */
    PASSWORD("user.password.retry.limit.exceed", "user.password.retry.limit.count"),

    /**
     * 短信登录
     */
    SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"),

    /**
     * 小程序登录
     */
    XCX("", "");

    /**
     * 登录重试超出限制提示
     */
    final String retryLimitExceed;

    /**
     * 登录重试限制计数提示
     */
    final String retryLimitCount;
}

src/main/java/com/ruoyi/system/controller/SysUserController.java#add()

 user.setPassword(BCrypt.hashpw(user.getPassword()));

BCrypt#hashpw()

 public static String hashpw(String password) {
        return hashpw(password, gensalt());//随机创建盐
    }

登录校验src/main/java/com/ruoyi/auth/service/SysLoginService.java#checkLogin()

/**
     * 登录校验
     */
    private void checkLogin(LoginType loginType, String username, Supplier<Boolean> supplier) {
        String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
        String loginFail = Constants.LOGIN_FAIL;
        Integer maxRetryCount = userPasswordProperties.getMaxRetryCount();
        Integer lockTime = userPasswordProperties.getLockTime();

        // 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip)
        Integer errorNumber = RedisUtils.getCacheObject(errorKey);
        // 锁定时间内登录 则踢出
        if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) {
            recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
            throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
        }

        //密码不正确
        if (supplier.get()) {
            // 是否第一次
            errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
            // 达到规定错误次数 则锁定登录
            if (errorNumber.equals(maxRetryCount)) {
                RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
                recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
                throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
            } else {
                // 未达到规定错误次数 则递增
                RedisUtils.setCacheObject(errorKey, errorNumber);
                recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
                throw new UserException(loginType.getRetryLimitCount(), errorNumber);
            }
        }
        // 登录成功 清空错误次数
        RedisUtils.deleteObject(errorKey);
    }

src/main/java/com/ruoyi/common/satoken/utils/LoginHelper.java#loginByDevice()文章来源地址https://www.toymoban.com/news/detail-437179.html

/**
     * 登录系统 基于 设备类型
     * 针对相同用户体系不同设备
     *
     * @param loginUser 登录用户信息
     */
    public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) {
        SaStorage storage = SaHolder.getStorage();//当前的请求中
        storage.set(LOGIN_USER_KEY, loginUser);
        storage.set(USER_KEY, loginUser.getUserId());
        SaLoginModel model = new SaLoginModel();
        if (ObjectUtil.isNotNull(deviceType)) {
            model.setDevice(deviceType.getDevice());
        }
        //执行登录操作
        StpUtil.login(loginUser.getLoginId(), model.setExtra(USER_KEY, loginUser.getUserId()));
        //把登录信息存放发哦SaSession中
        //由于SaTokenDao的实现类PlusSaTokenDao里面的方法都使用了Redis,用户信息都被存放到了Redis中
        StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
    }

到了这里,关于RuoYi-Cloud-Plus 登录过程源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

    原视频链接 https://www.bilibili.com/video/BV1mg4y1s75r/?spm_id_from=333.337.search-card.all.clickvd_source=c15794e732e28886fefab201ec9c6253 结合 RuoYi-Cloud 和 RuoYi-App 实现微信小程序的授权登录。 之前讲过前后端分离版的授权登录,逻辑大致一致,不同点有: 微信头像和昵称的获取方式。由于最新的本地

    2024年02月09日
    浏览(45)
  • Ruoyi若依前后端分离框架【若依登录详细过程】

    后端包含ruoyi-admin,ruoyi-common,ruoyi-framework等多个模块,ruoyi-admin为启动模块。先看一下ruoyi-admin/src/main/application.yml配置文件。 指定了服务端启动的端口8080。我们运行ruoyi-admin/src/main/java/com/ruoyi/ RuoYiApplication.java即可启动后端,监听8080端口。 我们回到前端的登录界面。 views

    2024年02月05日
    浏览(46)
  • 重写RuoYi-Cloud所有功能 整合 SpringCloudAlibaba Dubbo Mybatis-Plus MQ OSS ES Xxl-Job Docker 全方位升级 定期同步

    转载于:https://blog.csdn.net/weixin_40461281/article/details/122837923 RuoYi-Cloud-Plus  微服务通用权限管理系统  重写 RuoYi-Cloud 全方位升级(不兼容原框架) 系统演示: 传送门 分布式集群版本(功能一致) 功能介绍 使用技术 文档地址 特性注意事项 微服务权限管理系统 RuoYi-Cloud-Plus RuoYi-Clo

    2024年02月08日
    浏览(27)
  • USG6000V防火墙WEB登录界面超详细配置过程

    防火墙在企业中的应用非常广泛,几乎现在每个公司的网络中都会用到防火墙,或多或少做一些安全策略。公司中也一定存在着负责日常维护这些网络设备的工作人员。如果稍微专业一点,可能他们会通过直接敲命令的方式来管理防护墙,但是也存在着一些专业知识不是那么

    2024年01月17日
    浏览(24)
  • html好看的登录界面2(十四种风格登录源码)

    作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131206421 html好看的登录页面2(十四种风格登录源码) 登录的第二版,大气好看的网站登录页面html源码模板,页面源码,适用于各种项目,也可以用作学习,各种登录风格都有,高端大气上档次,直接嵌入使用,

    2024年02月09日
    浏览(25)
  • Nessus安装过程或者结束后打不开登录界面(https://localhost:8834/#/)解决办法

    解决办法如下,分为三个步骤 第一步: 首先打开浏览器 设置 进入到 常规选项 一直往下滑,找到 网络设置 点击设置将默认代理设置为 不使用代理服务器 ,第一步就ok了,我们接着第二步; 第二步: 打开终端,给一个 sudo ,使用以下指令启动Nessus系统服务 第三步: 进入登

    2024年02月02日
    浏览(29)
  • spring 用户通过交互界面登录成功事件源码分析

    spring-security-web:5.6.7 用户通过前端交互界面登录成功触发此事件 org.springframework.security.authentication.event.InteractiveAuthenticationSuccessEvent 事件触发过程 用户名密码认证过滤器 org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 认证处理过滤器 org.springframework.security.we

    2024年02月16日
    浏览(27)
  • 【Unity 3D】图形界面GUI的讲解及在C#中实现用户登录界面的实战(附源码)

    需要源码请点赞关注收藏后评论区留言并且私信~~~ 在游戏开发过程中,游戏界面占据了非常重要的地位,玩家启动游戏的时候,首先看到的就是游戏的UI,其中包含图片、按钮和高级控件等等,UGUI和GUI是Unity 3D中最常用的两个UI系统。 GUI是Graphical User Interface的缩写,Unity的图

    2024年02月10日
    浏览(33)
  • ruoyi-cloud部署

    默认你已经安装mysql,nacos,seata,sentinel等(没有的可以先找教程安装) 1、下载源码:git clone https://gitee.com/zhangmrit/ruoyi-cloud 2、项目依赖导入,选择自己的maven环境等,创建三个库ry-cloud、ry-config、ry-seata执行下面三个sql,把quartz放到ry-cloud 3、nacos配置,生成配置列表(配置该

    2024年02月11日
    浏览(31)
  • ruoyi cloud集成casdoor

            之前写过一篇关于ruoyi cloud集成cas的但是使用的apereo的单点登录,该应用的文档都是英文文档,尝试一下集成casdoor,其官方文档比较详细。 考虑到有些小伙伴上git不方便,需要用到的代码和Windows工具,都在这了         Go 1.6+ Node.js LTS (16或14) 这里我使用的是

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包