在实际业务需求中,登录功能通常需要更灵活的设计,不仅限于简单的用户名加密码的方式。有时候,用户可能希望通过手机号、邮箱或用户名等多种方式进行登录。因此,在实现登录功能时,需要考虑支持多种登录方式,以提高用户体验和灵活性。
在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.java
中login
方法里加入以下代码
// 判断是否是手机号
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. 通过用户名+密码方式登录
通过手机号+密码方式登录
通过邮箱+密码方式登录
powered by kaifamiao