xm
2024-06-14 722af26bc6fec32bb289b1df51a9016a4935610f
提交 | 用户 | 时间
722af2 1 package com.dl.common.helper;
X 2
3 import cn.dev33.satoken.context.SaHolder;
4 import cn.dev33.satoken.context.model.SaStorage;
5 import cn.dev33.satoken.stp.SaLoginModel;
6 import cn.dev33.satoken.stp.StpUtil;
7 import cn.hutool.core.convert.Convert;
8 import cn.hutool.core.util.ObjectUtil;
9 import com.dl.common.constant.UserConstants;
10 import com.dl.common.core.domain.model.LoginUser;
11 import com.dl.common.enums.DeviceType;
12 import com.dl.common.enums.UserType;
13 import lombok.AccessLevel;
14 import lombok.NoArgsConstructor;
15
16 import java.util.Objects;
17
18 /**
19  * 登录鉴权助手
20  * <p>
21  * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app
22  * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios
23  * 可以组成 用户类型与设备类型多对多的 权限灵活控制
24  * <p>
25  * 多用户体系 针对 多种用户类型 但权限控制不一致
26  * 可以组成 多用户类型表与多设备类型 分别控制权限
27  *
28  * @author Lion Li
29  */
30 @NoArgsConstructor(access = AccessLevel.PRIVATE)
31 public class LoginHelper {
32
33     public static final String LOGIN_USER_KEY = "loginUser";
34     public static final String USER_KEY = "userId";
35
36     /**
37      * 登录系统
38      *
39      * @param loginUser 登录用户信息
40      */
41     public static void login(LoginUser loginUser) {
42         loginByDevice(loginUser, null);
43     }
44
45     /**
46      * 登录系统 基于 设备类型
47      * 针对相同用户体系不同设备
48      *
49      * @param loginUser 登录用户信息
50      */
51     public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) {
52         SaStorage storage = SaHolder.getStorage();
53         storage.set(LOGIN_USER_KEY, loginUser);
54         storage.set(USER_KEY, loginUser.getUserId());
55         SaLoginModel model = new SaLoginModel();
56         if (ObjectUtil.isNotNull(deviceType)) {
57             model.setDevice(deviceType.getDevice());
58         }
59         StpUtil.login(loginUser.getLoginId(), model.setExtra(USER_KEY, loginUser.getUserId()));
60         StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
61     }
62
63     /**
64      * 获取用户(多级缓存)
65      */
66     public static LoginUser getLoginUser() {
67         LoginUser loginUser = (LoginUser) SaHolder.getStorage().get(LOGIN_USER_KEY);
68         if (loginUser != null) {
69             return loginUser;
70         }
71         loginUser = (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);
72         SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
73         return loginUser;
74     }
75
76     /**
77      * 获取用户基于token
78      */
79     public static LoginUser getLoginUser(String token) {
80         return (LoginUser) StpUtil.getTokenSessionByToken(token).get(LOGIN_USER_KEY);
81     }
82
83     /**
84      * 获取用户id
85      */
86     public static String getUserId() {
87         String userId;
88         try {
89             userId = (String) SaHolder.getStorage().get(USER_KEY);
90             if (ObjectUtil.isNull(userId)) {
91                 userId = (String) StpUtil.getExtra(USER_KEY);
92                 SaHolder.getStorage().set(USER_KEY, userId);
93             }
94         } catch (Exception e) {
95             return null;
96         }
97         return userId;
98     }
99
100     /**
101      * 获取部门ID
102      */
103     public static Long getDeptId() {
104         return getLoginUser().getDeptId();
105     }
106
107     /**
108      * 获取用户账户
109      */
110     public static String getUsername() {
111         return getLoginUser().getUsername();
112     }
113
114     /**
115      * 获取用户昵称
116      */
117     public static String getNickName() {
118         return getLoginUser().getNickName();
119     }
120
121     /**
122      * 获取用户类型
123      */
124     public static UserType getUserType() {
125         String loginId = StpUtil.getLoginIdAsString();
126         return UserType.getUserType(loginId);
127     }
128
129     /**
130      * 是否为管理员
131      *
132      * @param userId 用户ID
133      * @return 结果
134      */
135     public static boolean isAdmin(String userId) {
136         return UserConstants.ADMIN_ID.equals(userId);
137     }
138
139     public static boolean isAdmin() {
140         return isAdmin(getUserId());
141     }
142
143 }