用户登录实现
本文将详细介绍一个用户认证系统的 API,包括登录、获取用户信息、获取系统配置以及注销功能。除此之外,我们还将探讨相关的代码实现,帮助开发者更好地理解和应用这些功能。
目录
系统概述
本用户认证系统提供了一系列 API 接口,用于管理用户的登录、信息获取、系统配置查看以及注销功能。通过这些接口,开发者可以轻松集成认证机制,确保系统的安全性和用户数据的保护。
API 接口详解
1. 用户登录
功能描述
用户通过提供用户名和密码进行登录,成功后系统会返回一个 JWT(JSON Web Token)令牌,用于后续的认证请求。
请求
方法:
POST
URL:
http://localhost:8080/api/user/login
请求体:
{ "username": "admin", "password": "Kimi@2024" }
响应
{
"message": "成功",
"data": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzA2MzMyNjUsInVzZXJJZCI6MX0=.aTVsg7Wj4LioKnj6nZg6v8rqMyroQA8yIvliYI8n1v8",
"code": 200
}
说明
- 成功登录后,
data
字段会返回一个 JWT 令牌,该令牌将在后续的请求中用于用户认证。
2. 获取用户信息
功能描述
通过 JWT 令牌,用户可以获取当前登录用户的详细信息,包括角色、权限、昵称等。
请求
方法:
GET
URL:
http://localhost:8080/api/user
请求头:
Authorization: Bearer <JWT_TOKEN>
响应
{
"message": null,
"data": {
"role": "ADMIN",
"phone": "",
"permissions": [
"USER:READ",
"USER:EDIT",
"DATASET:CREATE",
"DATASET:READ",
"DATASET:EDIT",
"APPLICATION:READ",
"APPLICATION:CREATE",
"APPLICATION:DELETE",
"APPLICATION:EDIT",
"SETTING:READ",
"MODEL:READ",
"MODEL:EDIT",
"MODEL:DELETE",
"MODEL:CREATE",
"TEAM:READ",
"TEAM:CREATE",
"TEAM:DELETE",
"TEAM:EDIT",
"..."
],
"nick_name": "系统管理员",
"id": "1",
"email": "",
"username": "admin"
},
"code": 200
}
说明
- 需要在请求头中携带有效的 JWT 令牌。
- 返回的数据包括用户的角色、权限列表、昵称、ID、邮箱和用户名等信息。
3. 获取系统配置
功能描述
获取系统的配置信息,如版本号和许可证状态,帮助用户了解系统的当前状态。
请求
方法:
GET
URL:
http://localhost:8080/api/profile
请求头:
Authorization: Bearer <JWT_TOKEN>
响应
{
"message": null,
"data": {
"IS_XPACK": false,
"XPACK_LICENSE_IS_VALID": false,
"version": "v1.5.1 (build at 2024-08-29T17:29, commit: 30b1bdfe)"
},
"code": 200
}
说明
- 需要在请求头中携带有效的 JWT 令牌。
- 返回的数据包括系统是否启用 XPACK、许可证的有效性以及系统版本信息。
4. 用户注销
功能描述
用户通过此接口可以注销当前会话,使 JWT 令牌失效,确保账号安全。
请求
方法:
POST
URL:
http://localhost:8080/api/user/logout
请求头:
Authorization: Bearer <JWT_TOKEN>
响应
{
"code": 200,
"message": "成功",
"data": true
}
说明
- 注销操作将使当前 JWT 令牌失效。
- 需要在请求头中携带有效的 JWT 令牌。
5. 用户管理
GET http://localhost:8080/api/user_manage/1/20
{
"code": 200,
"message": "成功",
"data":
{
"total": 1,
"records":
[
{
"id": "f0dd8f71-e4ee-11ee-8c84-a8a1595801ab",
"username": "admin",
"email": "",
"phone": "",
"is_active": true,
"role": "ADMIN",
"nick_name": "系统管理员",
"create_time": "2024-09-14T19:07:05.887462",
"update_time": "2024-09-14T19:08:25.556513",
"source": "LOCAL"
}
],
"current": 1,
"size": 20
}
}
注意事项
- 认证: 除了登录接口外,其他接口均需要在请求头中携带
Authorization
字段,格式为Bearer <JWT_TOKEN>
,其中<JWT_TOKEN>
为登录成功后返回的令牌。 - 响应码: 所有成功的响应均返回
code: 200
,失败时请参考具体的错误码说明。 - 密码安全: 请确保在传输过程中使用 HTTPS 以保障密码和令牌的安全。
代码实现
以下是用户认证系统的关键代码实现,基于 Java 语言和相关框架。
ApiProfileController
负责处理获取系统配置信息的请求。
package com.litongjava.maxkb.controller;
import com.jfinal.kit.Kv;
import com.litongjava.annotation.RequestPath;
import com.litongjava.model.result.ResultVo;
@RequestPath("/api/profile")
public class ApiProfileController {
@RequestPath
public ResultVo index() {
Kv data = Kv.by("version", "v1.5.1 (build at 2024-08-29T17:29, commit: 30b1bdfe)");
data.set("IS_XPACK", false).set("XPACK_LICENSE_IS_VALID", false);
return ResultVo.ok(data);
}
}
AppConstant
定义应用程序的常量,例如用于 JWT 生成的密钥。
package com.litongjava.maxkb.consts;
public class AppConstant {
public static final String SECRET_KEY = "java-max-kb";
}
ApiUserController
处理用户相关的请求,包括获取用户信息、登录和注销。
package com.litongjava.maxkb.controller;
import com.litongjava.annotation.RequestPath;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.maxkb.model.UserLoginReqVo;
import com.litongjava.maxkb.service.UserService;
import com.litongjava.model.result.ResultVo;
import com.litongjava.tio.boot.http.TioRequestContext;
@RequestPath("/api/user")
public class ApiUserController {
@RequestPath
public ResultVo index() {
Long id = TioRequestContext.getUserIdLong();
return Aop.get(UserService.class).index(id);
}
public ResultVo login(UserLoginReqVo vo) {
return Aop.get(UserService.class).login(vo);
}
public ResultVo logout() {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(UserService.class).logout(userId);
}
}
UserService
业务逻辑层,负责处理用户的登录、信息获取和注销操作。
package com.litongjava.maxkb.service;
import java.util.List;
import com.jfinal.kit.Kv;
import com.litongjava.db.TableInput;
import com.litongjava.db.TableResult;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.kit.RecordUtils;
import com.litongjava.maxkb.constant.TableNames;
import com.litongjava.maxkb.consts.AppConstant;
import com.litongjava.maxkb.consts.KbTableNames;
import com.litongjava.maxkb.model.ResultPage;
import com.litongjava.maxkb.model.UserLoginReqVo;
import com.litongjava.model.page.Page;
import com.litongjava.model.result.ResultVo;
import com.litongjava.table.services.ApiTable;
import com.litongjava.tio.utils.crypto.Md5Utils;
import com.litongjava.tio.utils.jwt.JwtUtils;
import com.litongjava.tio.utils.token.TokenManager;
public class UserService {
public ResultVo login(UserLoginReqVo vo) {
vo.setPassword(Md5Utils.getMD5(vo.getPassword()));
String loginSql = String.format("select id from %s where username=? and password=?", KbTableNames.max_kb_user);
Long userId = Db.queryLong(loginSql, vo.getUsername(), vo.getPassword());
if (userId == null) {
return ResultVo.fail("用户名或者密码不正确");
}
String token = JwtUtils.createTokenByUserId(AppConstant.SECRET_KEY, userId);
TokenManager.login(userId, token);
return ResultVo.ok("成功", token);
}
public ResultVo index(Long userId) {
String sql = String.format("select id,username,email,phone,nick_name,role from %s where id=?", TableNames.max_kb_user);
Row row = Db.findFirst(sql, userId);
Kv kv = row.toKv();
List<String> permissions = Aop.get(PermissionsService.class).getPermissionsByRole(kv.getStr("role"));
kv.set("permissions", permissions);
return ResultVo.ok(kv);
}
public ResultVo logout(Long userId) {
TokenManager.logout(userId);
return ResultVo.ok();
}
public ResultVo page(Integer pageNo, Integer pageSize) {
TableInput tableInput = new TableInput();
tableInput.setPageNo(pageNo).setPageSize(pageSize).setColumns("id,username,email,phone,is_active,role,nick_name,create_time,update_time,source");
TableResult<Page<Row>> tableResult = ApiTable.page(TableNames.max_kb_user, tableInput);
Page<Row> page = tableResult.getData();
int totalRow = page.getTotalRow();
List<Row> list = page.getList();
List<Kv> kvs = RecordUtils.recordsToKv(list, false);
ResultPage<Kv> resultPage = new ResultPage<>(pageNo, pageSize, totalRow, kvs);
return ResultVo.ok(resultPage);
}
}
总结
本文详细介绍了 MaxKb 用户认证系统的 API 接口及其实现,包括登录、获取用户信息、获取系统配置和注销功能。通过这些接口,开发者可以有效地管理用户认证过程,确保系统的安全性和可靠性。同时,通过提供的代码示例,读者可以更深入地理解系统的内部工作机制,并在实际项目中灵活应用。
在实际应用中,建议结合具体业务需求,对现有接口进行优化和扩展,例如增加多因素认证、完善权限管理等,以进一步提升系统的安全性和用户体验。