开发喵星球

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

在实际业务需求中,登录功能通常需要更灵活的设计,不仅限于简单的用户名加密码的方式。有时候,用户可能希望通过手机号、邮箱或用户名等多种方式进行登录。因此,在实现登录功能时,需要考虑支持多种登录方式,以提高用户体验和灵活性。

一、导入依赖

ruoyi-common模块中引入hutool依赖包

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

🎁 Hutool是一个Java工具包,它提供了丰富的工具和方法,涵盖了许多常见的开发场景和需求。

二、实现登录接口

/**
 * 登录接口
 *
 * @param username   用户名称,可以是手机号、邮箱或用户名等登录方式
 * @param password   用户密码
 * @param rememberMe 是否记住我,用于设置登录状态的保持时间
 * @return 返回登录结果,成功则返回成功信息,失败则返回错误信息
 */
@ResponseBody
@PostMapping("/login")
public AjaxResult login(String username, String password, Boolean rememberMe) {
    // 判断用户名是否为空
    if (StrUtil.isEmpty(username)) {
        return AjaxResult.error("登录名称不能为空");
    }
    // 判断密码是否为空
    if (StrUtil.isEmpty(password)) {
        return AjaxResult.error("登录密码不能为空");
    }
    // 创建用户名密码令牌,用于Shiro进行身份认证
    UsernamePasswordToken token = new UsernamePasswordToken(username, password, false);
    // 获取当前用户的主体对象
    Subject subject = SecurityUtils.getSubject();
    try {
        // 使用令牌进行登录认证
        subject.login(token);
        // 登录成功,返回成功信息
        return success();
    } catch (AuthenticationException e) {
        // 登录失败,捕获AuthenticationException异常,并返回错误信息
        return AjaxResult.error("登录名称或密码错误");
    }
}

代码解析:
– @ResponseBody:注解表示该方法的返回结果直接写入HTTP响应体中,而不是通过视图解析器解析返回页面。
– @PostMapping(“/login”):注解指定该方法处理POST请求,并映射到路径”/login”。
– String username, String password, Boolean rememberMe:方法接收用户输入的用户名、密码和是否记住我的参数。
– StrUtil.isEmpty(username):使用Hutool工具类中的StrUtil判断用户名是否为空。
– UsernamePasswordToken token = new UsernamePasswordToken(username, password, false):创建用户名密码令牌,用于Shiro进行身份认证。第一个参数是用户名,第二个参数是密码,第三个参数表示是否记住我。
– Subject subject = SecurityUtils.getSubject():获取当前用户的主体对象,用于进行登录认证。
– subject.login(token):使用令牌进行登录认证,如果认证成功则登录成功,否则抛出AuthenticationException异常。
– return success():登录成功时返回成功信息,AjaxResult.success()是一个自定义的方法,用于返回成功结果。
– catch (AuthenticationException e):捕获AuthenticationException异常,表示登录失败,返回错误信息。

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

ruoyi-framework模块的shiro/service/SysLoginService.javalogin方法里加入以下代码

// 判断是否是手机号
boolean maybeMobilePhoneNumber = ReUtil.isMatch(RegexPool.MOBILE, username);

// 判断是否是邮箱
boolean maybeEmail = ReUtil.isMatch(RegexPool.EMAIL, username);

// 如果用户为空且用户名可能是手机号,则查询手机号对应的用户信息
if (user == null && maybeMobilePhoneNumber) {
    user = userService.selectUserByPhoneNumber(username);
}

// 如果用户为空且用户名可能是邮箱,则查询邮箱对应的用户信息
if (user == null && maybeEmail) {
    user = userService.selectUserByEmail(username);
}

代码解析
ReUtil.isMatch(RegexPool.MOBILE, username):使用Hutool工具包中的ReUtil类判断输入的用户名是否匹配手机号的正则表达式。RegexPool.MOBILE是一个预定义的手机号正则表达式。
ReUtil.isMatch(RegexPool.EMAIL, username):使用Hutool工具包中的ReUtil类判断输入的用户名是否匹配邮箱的正则表达式。RegexPool.EMAIL是一个预定义的邮箱正则表达式。
userService.selectUserByPhoneNumber(username):如果用户名可能是手机号,则调用userService服务的selectUserByPhoneNumber方法查询数据库中与该手机号相关的用户信息。
userService.selectUserByEmail(username):如果用户名可能是邮箱,则调用userService服务的selectUserByEmail方法查询数据库中与该邮箱相关的用户信息。

四、接口功能测试

测试工具:postman
下载地址:https://www.postman.com/downloads/
1. 通过用户名+密码方式登录

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

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

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-03-19 15:42:05 阅读量:274
<<   >>


powered by kaifamiao