开发喵星球

若依实现手机号/邮箱/用户名多种登录方式(250)

需求提出

在实际业务需求中,登录功能不仅限于通过用户名和密码登录,为了增强系统的灵活性和用户体验,我们需要扩展登录功能,使用户能够通过手机号、邮箱、用户名等多种方式登录。

相关介绍

Hutool是一个小而全的Java工具类库,通过其丰富的工具类和方法,简化了Java开发中的很多常见任务。Hutool的目标是“让Java语言更加优雅”,其提供的功能涵盖了字符串处理、日期处理、文件操作、网络请求、加密解密、Excel操作等多个方面。

Hutool 的主要特点
轻量级Hutool是一个小而全的工具类库,依赖少且体积小,适合嵌入各种Java项目中。
功能丰富:提供了大量的工具类和方法,几乎涵盖了Java开发中的常见任务。
易用性强:设计简洁,使用方便,能够显著提高开发效率。
无第三方依赖:大部分功能不依赖于第三方库,降低了使用成本和复杂度。

解决思路

  1. 引入工具库:使用Hutool工具库来简化字符串操作和正则匹配。
  2. 扩展登录逻辑:在登录接口中加入手机号和邮箱的登录逻辑。
  3. 修改登录接口:在SysLoginService中实现多种登录方式的判断和处理。

所需技术

项目结构树

ruoyi-common
├── pom.xml
ruoyi-framework
├── src
│   ├── main
│   │   ├── java
│   │       └── com
│   │           └── ruoyi
│   │               └── framework
│   │                   └── shiro
│   │                       └── service
│   │                           └── SysLoginService.java
ruoyi-admin
├── src
│   ├── main
│   │   ├── java
│   │       └── com
│   │           └── ruoyi
│   │               └── web
│   │                   └── controller
│   │                       └── system
│   │                           └── SysLoginController.java

注意事项

完整代码

一、导入依赖

ruoyi-common/pom.xml中引入Hutool依赖包:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.23</version>
</dependency>

二、实现登录接口

SysLoginController.java中修改登录接口:

@ResponseBody
@PostMapping("/login")
public AjaxResult login(String username, String password) {
    if (StrUtil.isEmpty(username)) {
        return AjaxResult.error("登录名称不能空");
    }
    if (StrUtil.isEmpty(password)) {
        return AjaxResult.error("登录密码不能空");
    }
    UsernamePasswordToken token = new UsernamePasswordToken(username, password, false);
    Subject subject = SecurityUtils.getSubject();
    try {
        subject.login(token);
        return AjaxResult.success("登录成功");
    } catch (AuthenticationException e) {
         return AjaxResult.error("登录名称或密码错误");
    }
}

三、手机号/邮箱登录逻辑

SysLoginService.java中加入手机号和邮箱的登录逻辑:

public SysUser login(String username, String password) {
    // 判断是否是手机号
    boolean isPhone = ReUtil.isMatch(RegexPool.MOBILE, username);
    // 判断是否是邮箱
    boolean isEmail = ReUtil.isMatch(RegexPool.EMAIL, username);
    // 通过用户名查询用户信息
    SysUser user = userService.selectUserByUserName(username);
    // 如果用户为空且用户名是手机号,则通过手机号查询用户信息
    if (user == null && isPhone) {
        user = userService.selectUserByPhoneNumber(username);
    }
    // 如果用户为空且用户名是邮箱,则通过邮箱查询用户信息
    if (user == null && isEmail) {
        user = userService.selectUserByEmail(username);
    }
    // 校验用户是否存在
    if (user == null) {
        throw new UserNotExistsException();
    }
    // 校验用户状态
    checkUserAllowed(user);
    checkUserIsNotLocked(user);
    // 校验密码是否正确
    if (!passwordService.matches(user, password)) {
        throw new UserPasswordNotMatchException();
    }
    // 记录登录信息
    recordLoginInfo(user);
    return user;
}

接口功能测试

  1. 通过用户名+密码方式登录
POST /login
Content-Type: application/json

{
    "username": "admin",
    "password": "123456.."
}


2. 通过手机号+密码方式登录

POST /login
Content-Type: application/json

{
    "username": "15888888888",
    "password": "123456.."
}


3. 通过邮箱+密码方式登录

POST /login
Content-Type: application/json

{
    "username": "user@example.com",
    "password": "123456.."
}

运行结果

通过上述配置和代码修改,用户可以通过用户名、手机号、邮箱三种方式登录系统,登录成功后返回相应的成功信息,登录失败则返回错误信息。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-06-24 16:43:50 阅读量:278
<<   >>


powered by kaifamiao