系统提供了 2 种类型的用户,分别满足对应的管理后台、用户 App 场景。
1.AdminUser 管理员用户,前端访问 s-ui-admin-vue3管理后台,后端访问 /admin-api/** RESTful API 接口。
2.MemberUser 会员用户,前端访问 s-ui-user用户 App,后端访问 /app-api/** RESTful API 接口。
虽然是不同类型的用户,他们访问 RESTful API 接口时,都通过 Token 认证机制,具体可见 《开发指南 —— 功能权限》。
1. 表结构
2 种类型的时候,采用不同数据库的表进行存储,管理员用户对应 system_users 表,会员用户对应 member_user 表。如下图所示:
为什么不使用统一的用户表?
确实可以采用这样的方案,新增 type
字段区分用户类型。不同用户类型的信息字段,例如说上图的 dept_id
、post_ids
等等,可以增加拓展表,或者就干脆“冗余”在用户表中。
不过实际项目中,不同类型的用户往往是不同的团队维护,并且这也是绝大多团队的实践,所以我们采用了多个用户表的方案。
如果表需要关联多种类型的用户,例如说上述的 system_oauth2_access_token 访问令牌表,可以通过 user_type 字段进行区分。并且 user_type 对应 UserTypeEnum 全局枚举,代码如下:
2. 如何获取当前登录的用户?
使用 SecurityFrameworkUtils 提供的如下方法,可以获得当前登录用户的信息:
/**
* 【最常用】获得当前用户的编号,从上下文中
*
* @return 用户编号
*/
@Nullable
public static Long getLoginUserId() { /** 省略实现 */ }
/**
* 获取当前用户
*
* @return 当前用户
*/
@Nullable
public static LoginUser getLoginUser() { /** 省略实现 */ }
/**
* 获得当前用户的角色编号数组
*
* @return 角色编号数组
*/
@Nullable
public static Set<Long> getLoginUserRoleIds() { /** 省略实现 */ }
3. 账号密码登录
3.1 管理后台的实现
使用 username 账号 + password 密码进行登录,由 AuthController 提供 /admin-api/system/auth/login 接口。代码如下:
@PostMapping("/login") @Operation(summary = "使用账号密码登录") &#