外观
如何实现用户登录功能
这是什么?
就像进入一个需要会员卡的俱乐部,用户使用系统时也需要先登录。这个指南将教你如何给系统添加"验证身份"的功能。
📝 实现步骤
第一步:设计登录信息
首先,我们需要定义用户登录时需要提供什么信息,就像设计一张登记表:
java
@Data
public class LoginDto {
/**
* 用户名(账号)
*/
@NotBlank(message = "请输入用户名!")
private String accountNo;
/**
* 密码
*/
@NotBlank(message = "请输入密码!")
private String password;
}
第二步:创建登录接口
接下来,创建一个处理登录请求的接口,就像设置一个接待窗口:
java
/**
* 用户登录接口
* @param dto 登录信息
* @return 登录结果
*/
@PostMapping(value = "/login", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<ResultVo<SessionVo>> login(@RequestBody @Valid LoginDto dto) {
return Mono.just(ResultVo.ok(loginService.login(dto)));
}
⚠️ 特别注意: 这个接口必须返回ResultVo<SessionVo>
类型的结果,否则登录会失败。
第三步:编写登录逻辑
这一步是实现具体的登录验证逻辑,就像检查会员卡是否有效:
java
@Override
public SessionVo login(LoginDto dto) {
// 验证用户名和密码
if (!"admin".equals(dto.getAccountNo()) || !"123456".equals(dto.getPassword())) {
throw new InvokeException(-1, "用户名或密码错误,请重试!");
}
// 创建用户会话信息
SessionVo session = new SessionVo();
session.setIsSystem("admin".equals(dto.getAccountNo())); // 是否是超级管理员
session.setUserId("1"); // 用户ID
session.setNickname("wueasy"); // 用户昵称
// 设置用户权限
Set<String> authorizeCodeList = new HashSet<String>();
authorizeCodeList.add("user");
session.setAuthorizeCodeList(authorizeCodeList); // 用户权限代码
// 设置可访问的地址
Set<String> linkUrlSetAll = new HashSet<String>();
linkUrlSetAll.add("/demo/get");
session.setAuthorizeUrlList(linkUrlSetAll); // 可访问的地址列表
return session;
}
第四步:了解会话信息
SessionVo(会话信息)包含以下重要信息:
🔑 基本信息
userId
:用户的唯一标识nickname
:用户的昵称avatarUrl
:用户头像地址
👮 权限信息
isSystem
:是否是超级管理员authorizeUrlList
:允许访问的网址列表authorizeCodeList
:用户的权限代码列表
🗃️ 扩展信息
extendedMap
:额外的用户信息successfulMap
:登录成功时返回的信息
第五步:配置系统
最后,在配置文件中设置登录相关的规则:
yaml
wueasy:
gateway:
filter:
session:
enabled: true # 启用登录验证
items:
- type: redis # 使用redis存储用户信息
redis-auto-expire: true # 自动延长登录有效期
expire: PT1H # 登录1小时后过期
urls: # 需要登录才能访问的地址
- /demo/**
user-login-urls: /demo/login # 登录接口地址
security-visitor-urls: # 不需要登录就能访问的地址
- /demo/login
# Redis数据库配置
spring:
data:
redis:
database: 9
host: 127.0.0.1
port: 6379
password: 123456
timeout: 3000
🚀 如何使用
发送登录请求
shell
curl --location --request POST "http://127.0.0.1:8080/demo/login" \
--header "Content-Type: application/json" \
--data-raw "{
\"accountNo\": \"admin\",
\"password\": \"123456\"
}"
登录成功返回示例
json
{
"code": 0, // 0表示成功
"data": {
"authorization": "demo:1:2f202192dd2744b9f5589080d765e43e" // 登录凭证
},
"successful": true // true表示成功
}
❓ 常见问题
1. 登录失败?
- ✓ 检查用户名和密码是否正确
- ✓ 确认接口地址是否正确
- ✓ 查看系统日志了解详细错误信息
2. 登录后无法访问其他功能?
- ✓ 检查登录凭证(authorization)是否正确传递
- ✓ 确认用户是否有相应的访问权限
- ✓ 验证登录是否已过期
3. Redis连接问题?
- ✓ 确认Redis服务是否正常运行
- ✓ 检查Redis连接配置是否正确
- ✓ 验证网络连接是否正常
💡 使用建议
开发测试时:
- 可以适当延长登录有效期
- 打开详细日志方便调试
正式使用时:
- 设置合理的密码强度要求
- 定期清理过期的会话信息
- 注意保护用户登录凭证
🆘 需要帮助?
如果遇到问题,可以:
- 📝 查看系统日志:
./logs/gateway.log
- 🔍 检查Redis中的会话信息
- 🌐 确认网络连接正常
- 📋 检查配置文件格式