feat(phase8): US7 用户管理模块(角色变更立即生效、禁用即失效)
- RedisService:新增 hPut/sAdd/sRemove/sMembers Set 操作
- RedisKeyManager:新增 userSessionsKey(userId) = user:sessions:{userId}
- AuthService:login 后将 token 加入 user:sessions 集合;logout 时从集合移除
- UserService:createUser/updateUser/updateRole/updateStatus
- updateRole:DB 写入后更新所有活跃 Token 的 role 字段(立即生效,无需重新登录)
- updateStatus(DISABLED):删除所有活跃 Token(立即失效),清除 sessions 集合
- UserController:5 个端点全部 @RequiresRoles("ADMIN")
- 集成测试:角色变更同一 Token 立即生效;禁用后 Token 立即 401
This commit is contained in:
@@ -22,4 +22,9 @@ public final class RedisKeyManager {
|
||||
public static String taskClaimKey(Long taskId) {
|
||||
return "task:claim:" + taskId;
|
||||
}
|
||||
|
||||
/** User active sessions set key: user:sessions:{userId} */
|
||||
public static String userSessionsKey(Long userId) {
|
||||
return "user:sessions:" + userId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,4 +58,27 @@ public class RedisService {
|
||||
Object val = redisTemplate.opsForHash().get(key, field);
|
||||
return val != null ? val.toString() : null;
|
||||
}
|
||||
|
||||
/** 更新 Hash 中的单个字段(不改变其他字段和 TTL)。 */
|
||||
public void hPut(String key, String field, String value) {
|
||||
redisTemplate.opsForHash().put(key, field, value);
|
||||
}
|
||||
|
||||
// Set operations(用于用户会话跟踪)
|
||||
|
||||
/** 向 Set 添加成员。 */
|
||||
public void sAdd(String key, String member) {
|
||||
redisTemplate.opsForSet().add(key, member);
|
||||
}
|
||||
|
||||
/** 从 Set 移除成员。 */
|
||||
public void sRemove(String key, String member) {
|
||||
redisTemplate.opsForSet().remove(key, (Object) member);
|
||||
}
|
||||
|
||||
/** 获取 Set 全部成员;Set 不存在时返回空集合。 */
|
||||
public java.util.Set<String> sMembers(String key) {
|
||||
java.util.Set<String> members = redisTemplate.opsForSet().members(key);
|
||||
return members != null ? members : java.util.Collections.emptySet();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user