AdminStpUtil.java 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220
  1. package cc.uncarbon.module.adminapi.util;
  2. import cn.dev33.satoken.SaManager;
  3. import cn.dev33.satoken.fun.SaFunction;
  4. import cn.dev33.satoken.listener.SaTokenEventCenter;
  5. import cn.dev33.satoken.session.SaSession;
  6. import cn.dev33.satoken.session.TokenSign;
  7. import cn.dev33.satoken.stp.SaLoginModel;
  8. import cn.dev33.satoken.stp.SaTokenInfo;
  9. import cn.dev33.satoken.stp.StpLogic;
  10. import java.util.List;
  11. /**
  12. * 后台管理专用 StpUtil
  13. * 文档见 SA-Token -> 多账户认证:https://sa-token.cc/doc.html#/up/many-account
  14. *
  15. * @author Uncarbon
  16. * @see cn.dev33.satoken.stp.StpUtil
  17. */
  18. public final class AdminStpUtil {
  19. private AdminStpUtil() {
  20. }
  21. /**
  22. * 多账号体系下的类型标识
  23. */
  24. public static final String TYPE = "AdminStpUtil";
  25. /**
  26. * 底层使用的 StpLogic 对象
  27. */
  28. public static StpLogic stpLogic = new StpLogic(TYPE);
  29. /**
  30. * 获取当前 StpLogic 的账号类型
  31. *
  32. * @return /
  33. */
  34. public static String getLoginType() {
  35. return stpLogic.getLoginType();
  36. }
  37. /**
  38. * 安全的重置 StpLogic 对象
  39. *
  40. * <br> 1、更改此账户的 StpLogic 对象
  41. * <br> 2、put 到全局 StpLogic 集合中
  42. * <br> 3、发送日志
  43. *
  44. * @param newStpLogic /
  45. */
  46. public static void setStpLogic(StpLogic newStpLogic) {
  47. // 1、重置此账户的 StpLogic 对象
  48. stpLogic = newStpLogic;
  49. // 2、添加到全局 StpLogic 集合中
  50. // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic
  51. SaManager.putStpLogic(newStpLogic);
  52. // 3、$$ 发布事件:更新了 stpLogic 对象
  53. SaTokenEventCenter.doSetStpLogic(stpLogic);
  54. }
  55. /**
  56. * 获取 StpLogic 对象
  57. *
  58. * @return /
  59. */
  60. public static StpLogic getStpLogic() {
  61. return stpLogic;
  62. }
  63. // ------------------- 获取 token 相关 -------------------
  64. /**
  65. * 返回 token 名称,此名称在以下地方体现:Cookie 保存 token 时的名称、提交 token 时参数的名称、存储 token 时的 key 前缀
  66. *
  67. * @return /
  68. */
  69. public static String getTokenName() {
  70. return stpLogic.getTokenName();
  71. }
  72. /**
  73. * 在当前会话写入指定 token 值
  74. *
  75. * @param tokenValue token 值
  76. */
  77. public static void setTokenValue(String tokenValue) {
  78. stpLogic.setTokenValue(tokenValue);
  79. }
  80. /**
  81. * 在当前会话写入指定 token 值
  82. *
  83. * @param tokenValue token 值
  84. * @param cookieTimeout Cookie存活时间(秒)
  85. */
  86. public static void setTokenValue(String tokenValue, int cookieTimeout) {
  87. stpLogic.setTokenValue(tokenValue, cookieTimeout);
  88. }
  89. /**
  90. * 在当前会话写入指定 token 值
  91. *
  92. * @param tokenValue token 值
  93. * @param loginModel 登录参数
  94. */
  95. public static void setTokenValue(String tokenValue, SaLoginModel loginModel) {
  96. stpLogic.setTokenValue(tokenValue, loginModel);
  97. }
  98. /**
  99. * 获取当前请求的 token 值
  100. *
  101. * @return 当前tokenValue
  102. */
  103. public static String getTokenValue() {
  104. return stpLogic.getTokenValue();
  105. }
  106. /**
  107. * 获取当前请求的 token 值 (不裁剪前缀)
  108. *
  109. * @return /
  110. */
  111. public static String getTokenValueNotCut() {
  112. return stpLogic.getTokenValueNotCut();
  113. }
  114. /**
  115. * 获取当前会话的 token 参数信息
  116. *
  117. * @return token 参数信息
  118. */
  119. public static SaTokenInfo getTokenInfo() {
  120. return stpLogic.getTokenInfo();
  121. }
  122. // ------------------- 登录相关操作 -------------------
  123. // --- 登录
  124. /**
  125. * 会话登录
  126. *
  127. * @param id 账号id,建议的类型:(long | int | String)
  128. */
  129. public static void login(Object id) {
  130. stpLogic.login(id);
  131. }
  132. /**
  133. * 会话登录,并指定登录设备类型
  134. *
  135. * @param id 账号id,建议的类型:(long | int | String)
  136. * @param device 设备类型
  137. */
  138. public static void login(Object id, String device) {
  139. stpLogic.login(id, device);
  140. }
  141. /**
  142. * 会话登录,并指定是否 [记住我]
  143. *
  144. * @param id 账号id,建议的类型:(long | int | String)
  145. * @param isLastingCookie 是否为持久Cookie,值为 true 时记住我,值为 false 时关闭浏览器需要重新登录
  146. */
  147. public static void login(Object id, boolean isLastingCookie) {
  148. stpLogic.login(id, isLastingCookie);
  149. }
  150. /**
  151. * 会话登录,并指定此次登录 token 的有效期, 单位:秒
  152. *
  153. * @param id 账号id,建议的类型:(long | int | String)
  154. * @param timeout 此次登录 token 的有效期, 单位:秒
  155. */
  156. public static void login(Object id, long timeout) {
  157. stpLogic.login(id, timeout);
  158. }
  159. /**
  160. * 会话登录,并指定所有登录参数 Model
  161. *
  162. * @param id 账号id,建议的类型:(long | int | String)
  163. * @param loginModel 此次登录的参数Model
  164. */
  165. public static void login(Object id, SaLoginModel loginModel) {
  166. stpLogic.login(id, loginModel);
  167. }
  168. /**
  169. * 创建指定账号 id 的登录会话数据
  170. *
  171. * @param id 账号id,建议的类型:(long | int | String)
  172. * @return 返回会话令牌
  173. */
  174. public static String createLoginSession(Object id) {
  175. return stpLogic.createLoginSession(id);
  176. }
  177. /**
  178. * 创建指定账号 id 的登录会话数据
  179. *
  180. * @param id 账号id,建议的类型:(long | int | String)
  181. * @param loginModel 此次登录的参数Model
  182. * @return 返回会话令牌
  183. */
  184. public static String createLoginSession(Object id, SaLoginModel loginModel) {
  185. return stpLogic.createLoginSession(id, loginModel);
  186. }
  187. // --- 注销
  188. /**
  189. * 在当前客户端会话注销
  190. */
  191. public static void logout() {
  192. stpLogic.logout();
  193. }
  194. /**
  195. * 会话注销,根据账号id
  196. *
  197. * @param loginId 账号id
  198. */
  199. public static void logout(Object loginId) {
  200. stpLogic.logout(loginId);
  201. }
  202. /**
  203. * 会话注销,根据账号id 和 设备类型
  204. *
  205. * @param loginId 账号id
  206. * @param device 设备类型 (填 null 代表注销该账号的所有设备类型)
  207. */
  208. public static void logout(Object loginId, String device) {
  209. stpLogic.logout(loginId, device);
  210. }
  211. /**
  212. * 会话注销,根据指定 Token
  213. *
  214. * @param tokenValue 指定 token
  215. */
  216. public static void logoutByTokenValue(String tokenValue) {
  217. stpLogic.logoutByTokenValue(tokenValue);
  218. }
  219. /**
  220. * 踢人下线,根据账号id
  221. * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
  222. *
  223. * @param loginId 账号id
  224. */
  225. public static void kickout(Object loginId) {
  226. stpLogic.kickout(loginId);
  227. }
  228. /**
  229. * 踢人下线,根据账号id 和 设备类型
  230. * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
  231. *
  232. * @param loginId 账号id
  233. * @param device 设备类型 (填 null 代表踢出该账号的所有设备类型)
  234. */
  235. public static void kickout(Object loginId, String device) {
  236. stpLogic.kickout(loginId, device);
  237. }
  238. /**
  239. * 踢人下线,根据指定 token
  240. * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
  241. *
  242. * @param tokenValue 指定 token
  243. */
  244. public static void kickoutByTokenValue(String tokenValue) {
  245. stpLogic.kickoutByTokenValue(tokenValue);
  246. }
  247. /**
  248. * 顶人下线,根据账号id 和 设备类型
  249. * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 </p>
  250. *
  251. * @param loginId 账号id
  252. * @param device 设备类型 (填 null 代表顶替该账号的所有设备类型)
  253. */
  254. public static void replaced(Object loginId, String device) {
  255. stpLogic.replaced(loginId, device);
  256. }
  257. // 会话查询
  258. /**
  259. * 判断当前会话是否已经登录
  260. *
  261. * @return 已登录返回 true,未登录返回 false
  262. */
  263. public static boolean isLogin() {
  264. return stpLogic.isLogin();
  265. }
  266. /**
  267. * 判断指定账号是否已经登录
  268. *
  269. * @return 已登录返回 true,未登录返回 false
  270. */
  271. public static boolean isLogin(Object loginId) {
  272. return stpLogic.isLogin(loginId);
  273. }
  274. /**
  275. * 检验当前会话是否已经登录,如未登录,则抛出异常
  276. */
  277. public static void checkLogin() {
  278. stpLogic.checkLogin();
  279. }
  280. /**
  281. * 获取当前会话账号id,如果未登录,则抛出异常
  282. *
  283. * @return 账号id
  284. */
  285. public static Object getLoginId() {
  286. return stpLogic.getLoginId();
  287. }
  288. /**
  289. * 获取当前会话账号id, 如果未登录,则返回默认值
  290. *
  291. * @param <T> 返回类型
  292. * @param defaultValue 默认值
  293. * @return 登录id
  294. */
  295. public static <T> T getLoginId(T defaultValue) {
  296. return stpLogic.getLoginId(defaultValue);
  297. }
  298. /**
  299. * 获取当前会话账号id, 如果未登录,则返回null
  300. *
  301. * @return 账号id
  302. */
  303. public static Object getLoginIdDefaultNull() {
  304. return stpLogic.getLoginIdDefaultNull();
  305. }
  306. /**
  307. * 获取当前会话账号id, 并转换为 String 类型
  308. *
  309. * @return 账号id
  310. */
  311. public static String getLoginIdAsString() {
  312. return stpLogic.getLoginIdAsString();
  313. }
  314. /**
  315. * 获取当前会话账号id, 并转换为 int 类型
  316. *
  317. * @return 账号id
  318. */
  319. public static int getLoginIdAsInt() {
  320. return stpLogic.getLoginIdAsInt();
  321. }
  322. /**
  323. * 获取当前会话账号id, 并转换为 long 类型
  324. *
  325. * @return 账号id
  326. */
  327. public static long getLoginIdAsLong() {
  328. return stpLogic.getLoginIdAsLong();
  329. }
  330. /**
  331. * 获取指定 token 对应的账号id,如果未登录,则返回 null
  332. *
  333. * @param tokenValue token
  334. * @return 账号id
  335. */
  336. public static Object getLoginIdByToken(String tokenValue) {
  337. return stpLogic.getLoginIdByToken(tokenValue);
  338. }
  339. /**
  340. * 获取当前 Token 的扩展信息(此函数只在jwt模式下生效)
  341. *
  342. * @param key 键值
  343. * @return 对应的扩展数据
  344. */
  345. public static Object getExtra(String key) {
  346. return stpLogic.getExtra(key);
  347. }
  348. /**
  349. * 获取指定 Token 的扩展信息(此函数只在jwt模式下生效)
  350. *
  351. * @param tokenValue 指定的 Token 值
  352. * @param key 键值
  353. * @return 对应的扩展数据
  354. */
  355. public static Object getExtra(String tokenValue, String key) {
  356. return stpLogic.getExtra(tokenValue, key);
  357. }
  358. // ------------------- Account-Session 相关 -------------------
  359. /**
  360. * 获取指定账号 id 的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回
  361. *
  362. * @param loginId 账号id
  363. * @param isCreate 是否新建
  364. * @return SaSession 对象
  365. */
  366. public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
  367. return stpLogic.getSessionByLoginId(loginId, isCreate);
  368. }
  369. /**
  370. * 获取指定 key 的 SaSession, 如果该 SaSession 尚未创建,则返回 null
  371. *
  372. * @param sessionId SessionId
  373. * @return Session对象
  374. */
  375. public static SaSession getSessionBySessionId(String sessionId) {
  376. return stpLogic.getSessionBySessionId(sessionId);
  377. }
  378. /**
  379. * 获取指定账号 id 的 Account-Session,如果该 SaSession 尚未创建,则新建并返回
  380. *
  381. * @param loginId 账号id
  382. * @return SaSession 对象
  383. */
  384. public static SaSession getSessionByLoginId(Object loginId) {
  385. return stpLogic.getSessionByLoginId(loginId);
  386. }
  387. /**
  388. * 获取当前已登录账号的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回
  389. *
  390. * @param isCreate 是否新建
  391. * @return Session对象
  392. */
  393. public static SaSession getSession(boolean isCreate) {
  394. return stpLogic.getSession(isCreate);
  395. }
  396. /**
  397. * 获取当前已登录账号的 Account-Session,如果该 SaSession 尚未创建,则新建并返回
  398. *
  399. * @return Session对象
  400. */
  401. public static SaSession getSession() {
  402. return stpLogic.getSession();
  403. }
  404. // ------------------- Token-Session 相关 -------------------
  405. /**
  406. * 获取指定 token 的 Token-Session,如果该 SaSession 尚未创建,则新建并返回
  407. *
  408. * @param tokenValue Token值
  409. * @return Session对象
  410. */
  411. public static SaSession getTokenSessionByToken(String tokenValue) {
  412. return stpLogic.getTokenSessionByToken(tokenValue);
  413. }
  414. /**
  415. * 获取当前 token 的 Token-Session,如果该 SaSession 尚未创建,则新建并返回
  416. *
  417. * @return Session对象
  418. */
  419. public static SaSession getTokenSession() {
  420. return stpLogic.getTokenSession();
  421. }
  422. /**
  423. * 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
  424. *
  425. * @return Token-Session 对象
  426. */
  427. public static SaSession getAnonTokenSession() {
  428. return stpLogic.getAnonTokenSession();
  429. }
  430. // ------------------- Active-Timeout token 最低活跃度 验证相关 -------------------
  431. /**
  432. * 续签当前 token:(将 [最后操作时间] 更新为当前时间戳)
  433. * <h2>
  434. * 请注意: 即使 token 已被冻结 也可续签成功,
  435. * 如果此场景下需要提示续签失败,可在此之前调用 checkActiveTimeout() 强制检查是否冻结即可
  436. * </h2>
  437. */
  438. public static void updateLastActiveToNow() {
  439. stpLogic.updateLastActiveToNow();
  440. }
  441. /**
  442. * 检查当前 token 是否已被冻结,如果是则抛出异常
  443. */
  444. public static void checkActiveTimeout() {
  445. stpLogic.checkActiveTimeout();
  446. }
  447. // ------------------- 过期时间相关 -------------------
  448. /**
  449. * 获取当前会话 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
  450. *
  451. * @return token剩余有效时间
  452. */
  453. public static long getTokenTimeout() {
  454. return stpLogic.getTokenTimeout();
  455. }
  456. /**
  457. * 获取指定 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
  458. *
  459. * @param token 指定token
  460. * @return token剩余有效时间
  461. */
  462. public static long getTokenTimeout(String token) {
  463. return stpLogic.getTokenTimeout(token);
  464. }
  465. /**
  466. * 获取当前登录账号的 Account-Session 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
  467. *
  468. * @return token剩余有效时间
  469. */
  470. public static long getSessionTimeout() {
  471. return stpLogic.getSessionTimeout();
  472. }
  473. /**
  474. * 获取当前 token 的 Token-Session 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
  475. *
  476. * @return token剩余有效时间
  477. */
  478. public static long getTokenSessionTimeout() {
  479. return stpLogic.getTokenSessionTimeout();
  480. }
  481. /**
  482. * 获取当前 token 剩余活跃有效期:当前 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token 已被冻结了)
  483. *
  484. * @return /
  485. */
  486. public static long getTokenActiveTimeout() {
  487. return stpLogic.getTokenActiveTimeout();
  488. }
  489. /**
  490. * 对当前 token 的 timeout 值进行续期
  491. *
  492. * @param timeout 要修改成为的有效时间 (单位: 秒)
  493. */
  494. public static void renewTimeout(long timeout) {
  495. stpLogic.renewTimeout(timeout);
  496. }
  497. /**
  498. * 对指定 token 的 timeout 值进行续期
  499. *
  500. * @param tokenValue 指定 token
  501. * @param timeout 要修改成为的有效时间 (单位: 秒,填 -1 代表要续为永久有效)
  502. */
  503. public static void renewTimeout(String tokenValue, long timeout) {
  504. stpLogic.renewTimeout(tokenValue, timeout);
  505. }
  506. // ------------------- 角色认证操作 -------------------
  507. /**
  508. * 获取:当前账号的角色集合
  509. *
  510. * @return /
  511. */
  512. public static List<String> getRoleList() {
  513. return stpLogic.getRoleList();
  514. }
  515. /**
  516. * 获取:指定账号的角色集合
  517. *
  518. * @param loginId 指定账号id
  519. * @return /
  520. */
  521. public static List<String> getRoleList(Object loginId) {
  522. return stpLogic.getRoleList(loginId);
  523. }
  524. /**
  525. * 判断:当前账号是否拥有指定角色, 返回 true 或 false
  526. *
  527. * @param role 角色
  528. * @return /
  529. */
  530. public static boolean hasRole(String role) {
  531. return stpLogic.hasRole(role);
  532. }
  533. /**
  534. * 判断:指定账号是否含有指定角色标识, 返回 true 或 false
  535. *
  536. * @param loginId 账号id
  537. * @param role 角色标识
  538. * @return 是否含有指定角色标识
  539. */
  540. public static boolean hasRole(Object loginId, String role) {
  541. return stpLogic.hasRole(loginId, role);
  542. }
  543. /**
  544. * 判断:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ]
  545. *
  546. * @param roleArray 角色标识数组
  547. * @return true或false
  548. */
  549. public static boolean hasRoleAnd(String... roleArray) {
  550. return stpLogic.hasRoleAnd(roleArray);
  551. }
  552. /**
  553. * 判断:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ]
  554. *
  555. * @param roleArray 角色标识数组
  556. * @return true或false
  557. */
  558. public static boolean hasRoleOr(String... roleArray) {
  559. return stpLogic.hasRoleOr(roleArray);
  560. }
  561. /**
  562. * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
  563. *
  564. * @param role 角色标识
  565. */
  566. public static void checkRole(String role) {
  567. stpLogic.checkRole(role);
  568. }
  569. /**
  570. * 校验:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ]
  571. *
  572. * @param roleArray 角色标识数组
  573. */
  574. public static void checkRoleAnd(String... roleArray) {
  575. stpLogic.checkRoleAnd(roleArray);
  576. }
  577. /**
  578. * 校验:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ]
  579. *
  580. * @param roleArray 角色标识数组
  581. */
  582. public static void checkRoleOr(String... roleArray) {
  583. stpLogic.checkRoleOr(roleArray);
  584. }
  585. // ------------------- 权限认证操作 -------------------
  586. /**
  587. * 获取:当前账号的权限码集合
  588. *
  589. * @return /
  590. */
  591. public static List<String> getPermissionList() {
  592. return stpLogic.getPermissionList();
  593. }
  594. /**
  595. * 获取:指定账号的权限码集合
  596. *
  597. * @param loginId 指定账号id
  598. * @return /
  599. */
  600. public static List<String> getPermissionList(Object loginId) {
  601. return stpLogic.getPermissionList(loginId);
  602. }
  603. /**
  604. * 判断:当前账号是否含有指定权限, 返回 true 或 false
  605. *
  606. * @param permission 权限码
  607. * @return 是否含有指定权限
  608. */
  609. public static boolean hasPermission(String permission) {
  610. return stpLogic.hasPermission(permission);
  611. }
  612. /**
  613. * 判断:指定账号 id 是否含有指定权限, 返回 true 或 false
  614. *
  615. * @param loginId 账号 id
  616. * @param permission 权限码
  617. * @return 是否含有指定权限
  618. */
  619. public static boolean hasPermission(Object loginId, String permission) {
  620. return stpLogic.hasPermission(loginId, permission);
  621. }
  622. /**
  623. * 判断:当前账号是否含有指定权限 [ 指定多个,必须全部具有 ]
  624. *
  625. * @param permissionArray 权限码数组
  626. * @return true 或 false
  627. */
  628. public static boolean hasPermissionAnd(String... permissionArray) {
  629. return stpLogic.hasPermissionAnd(permissionArray);
  630. }
  631. /**
  632. * 判断:当前账号是否含有指定权限 [ 指定多个,只要其一验证通过即可 ]
  633. *
  634. * @param permissionArray 权限码数组
  635. * @return true 或 false
  636. */
  637. public static boolean hasPermissionOr(String... permissionArray) {
  638. return stpLogic.hasPermissionOr(permissionArray);
  639. }
  640. /**
  641. * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
  642. *
  643. * @param permission 权限码
  644. */
  645. public static void checkPermission(String permission) {
  646. stpLogic.checkPermission(permission);
  647. }
  648. /**
  649. * 校验:当前账号是否含有指定权限 [ 指定多个,必须全部验证通过 ]
  650. *
  651. * @param permissionArray 权限码数组
  652. */
  653. public static void checkPermissionAnd(String... permissionArray) {
  654. stpLogic.checkPermissionAnd(permissionArray);
  655. }
  656. /**
  657. * 校验:当前账号是否含有指定权限 [ 指定多个,只要其一验证通过即可 ]
  658. *
  659. * @param permissionArray 权限码数组
  660. */
  661. public static void checkPermissionOr(String... permissionArray) {
  662. stpLogic.checkPermissionOr(permissionArray);
  663. }
  664. // ------------------- id 反查 token 相关操作 -------------------
  665. /**
  666. * 获取指定账号 id 的 token
  667. * <p>
  668. * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token,
  669. * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId
  670. * </p>
  671. *
  672. * @param loginId 账号id
  673. * @return token值
  674. */
  675. public static String getTokenValueByLoginId(Object loginId) {
  676. return stpLogic.getTokenValueByLoginId(loginId);
  677. }
  678. /**
  679. * 获取指定账号 id 指定设备类型端的 token
  680. * <p>
  681. * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token,
  682. * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId
  683. * </p>
  684. *
  685. * @param loginId 账号id
  686. * @param device 设备类型,填 null 代表不限设备类型
  687. * @return token值
  688. */
  689. public static String getTokenValueByLoginId(Object loginId, String device) {
  690. return stpLogic.getTokenValueByLoginId(loginId, device);
  691. }
  692. /**
  693. * 获取指定账号 id 的 token 集合
  694. *
  695. * @param loginId 账号id
  696. * @return 此 loginId 的所有相关 token
  697. */
  698. public static List<String> getTokenValueListByLoginId(Object loginId) {
  699. return stpLogic.getTokenValueListByLoginId(loginId);
  700. }
  701. /**
  702. * 获取指定账号 id 指定设备类型端的 token 集合
  703. *
  704. * @param loginId 账号id
  705. * @param device 设备类型,填 null 代表不限设备类型
  706. * @return 此 loginId 的所有登录 token
  707. */
  708. public static List<String> getTokenValueListByLoginId(Object loginId, String device) {
  709. return stpLogic.getTokenValueListByLoginId(loginId, device);
  710. }
  711. /**
  712. * 获取指定账号 id 指定设备类型端的 tokenSign 集合
  713. *
  714. * @param loginId 账号id
  715. * @param device 设备类型,填 null 代表不限设备类型
  716. * @return 此 loginId 的所有登录 tokenSign
  717. */
  718. public static List<TokenSign> getTokenSignListByLoginId(Object loginId, String device) {
  719. return stpLogic.getTokenSignListByLoginId(loginId, device);
  720. }
  721. /**
  722. * 返回当前会话的登录设备类型
  723. *
  724. * @return 当前令牌的登录设备类型
  725. */
  726. public static String getLoginDevice() {
  727. return stpLogic.getLoginDevice();
  728. }
  729. // ------------------- 会话管理 -------------------
  730. /**
  731. * 根据条件查询缓存中所有的 token
  732. *
  733. * @param keyword 关键字
  734. * @param start 开始处索引
  735. * @param size 获取数量 (-1代表一直获取到末尾)
  736. * @param sortType 排序类型(true=正序,false=反序)
  737. * @return token集合
  738. */
  739. public static List<String> searchTokenValue(String keyword, int start, int size, boolean sortType) {
  740. return stpLogic.searchTokenValue(keyword, start, size, sortType);
  741. }
  742. /**
  743. * 根据条件查询缓存中所有的 SessionId
  744. *
  745. * @param keyword 关键字
  746. * @param start 开始处索引
  747. * @param size 获取数量 (-1代表一直获取到末尾)
  748. * @param sortType 排序类型(true=正序,false=反序)
  749. * @return sessionId集合
  750. */
  751. public static List<String> searchSessionId(String keyword, int start, int size, boolean sortType) {
  752. return stpLogic.searchSessionId(keyword, start, size, sortType);
  753. }
  754. /**
  755. * 根据条件查询缓存中所有的 Token-Session-Id
  756. *
  757. * @param keyword 关键字
  758. * @param start 开始处索引
  759. * @param size 获取数量 (-1代表一直获取到末尾)
  760. * @param sortType 排序类型(true=正序,false=反序)
  761. * @return sessionId集合
  762. */
  763. public static List<String> searchTokenSessionId(String keyword, int start, int size, boolean sortType) {
  764. return stpLogic.searchTokenSessionId(keyword, start, size, sortType);
  765. }
  766. // ------------------- 账号封禁 -------------------
  767. /**
  768. * 封禁:指定账号
  769. * <p> 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
  770. *
  771. * @param loginId 指定账号id
  772. * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
  773. */
  774. public static void disable(Object loginId, long time) {
  775. stpLogic.disable(loginId, time);
  776. }
  777. /**
  778. * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
  779. *
  780. * @param loginId 账号id
  781. * @return /
  782. */
  783. public static boolean isDisable(Object loginId) {
  784. return stpLogic.isDisable(loginId);
  785. }
  786. /**
  787. * 校验:指定账号是否已被封禁,如果被封禁则抛出异常
  788. *
  789. * @param loginId 账号id
  790. */
  791. public static void checkDisable(Object loginId) {
  792. stpLogic.checkDisable(loginId);
  793. }
  794. /**
  795. * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
  796. *
  797. * @param loginId 账号id
  798. * @return /
  799. */
  800. public static long getDisableTime(Object loginId) {
  801. return stpLogic.getDisableTime(loginId);
  802. }
  803. /**
  804. * 解封:指定账号
  805. *
  806. * @param loginId 账号id
  807. */
  808. public static void untieDisable(Object loginId) {
  809. stpLogic.untieDisable(loginId);
  810. }
  811. // ------------------- 分类封禁 -------------------
  812. /**
  813. * 封禁:指定账号的指定服务
  814. * <p> 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
  815. *
  816. * @param loginId 指定账号id
  817. * @param service 指定服务
  818. * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
  819. */
  820. public static void disable(Object loginId, String service, long time) {
  821. stpLogic.disable(loginId, service, time);
  822. }
  823. /**
  824. * 判断:指定账号的指定服务 是否已被封禁(true=已被封禁, false=未被封禁)
  825. *
  826. * @param loginId 账号id
  827. * @param service 指定服务
  828. * @return /
  829. */
  830. public static boolean isDisable(Object loginId, String service) {
  831. return stpLogic.isDisable(loginId, service);
  832. }
  833. /**
  834. * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常
  835. *
  836. * @param loginId 账号id
  837. * @param services 指定服务,可以指定多个
  838. */
  839. public static void checkDisable(Object loginId, String... services) {
  840. stpLogic.checkDisable(loginId, services);
  841. }
  842. /**
  843. * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
  844. *
  845. * @param loginId 账号id
  846. * @param service 指定服务
  847. * @return see note
  848. */
  849. public static long getDisableTime(Object loginId, String service) {
  850. return stpLogic.getDisableTime(loginId, service);
  851. }
  852. /**
  853. * 解封:指定账号、指定服务
  854. *
  855. * @param loginId 账号id
  856. * @param services 指定服务,可以指定多个
  857. */
  858. public static void untieDisable(Object loginId, String... services) {
  859. stpLogic.untieDisable(loginId, services);
  860. }
  861. // ------------------- 阶梯封禁 -------------------
  862. /**
  863. * 封禁:指定账号,并指定封禁等级
  864. *
  865. * @param loginId 指定账号id
  866. * @param level 指定封禁等级
  867. * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
  868. */
  869. public static void disableLevel(Object loginId, int level, long time) {
  870. stpLogic.disableLevel(loginId, level, time);
  871. }
  872. /**
  873. * 封禁:指定账号的指定服务,并指定封禁等级
  874. *
  875. * @param loginId 指定账号id
  876. * @param service 指定封禁服务
  877. * @param level 指定封禁等级
  878. * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
  879. */
  880. public static void disableLevel(Object loginId, String service, int level, long time) {
  881. stpLogic.disableLevel(loginId, service, level, time);
  882. }
  883. /**
  884. * 判断:指定账号是否已被封禁到指定等级
  885. *
  886. * @param loginId 指定账号id
  887. * @param level 指定封禁等级
  888. * @return /
  889. */
  890. public static boolean isDisableLevel(Object loginId, int level) {
  891. return stpLogic.isDisableLevel(loginId, level);
  892. }
  893. /**
  894. * 判断:指定账号的指定服务,是否已被封禁到指定等级
  895. *
  896. * @param loginId 指定账号id
  897. * @param service 指定封禁服务
  898. * @param level 指定封禁等级
  899. * @return /
  900. */
  901. public static boolean isDisableLevel(Object loginId, String service, int level) {
  902. return stpLogic.isDisableLevel(loginId, service, level);
  903. }
  904. /**
  905. * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常)
  906. *
  907. * @param loginId 指定账号id
  908. * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
  909. */
  910. public static void checkDisableLevel(Object loginId, int level) {
  911. stpLogic.checkDisableLevel(loginId, level);
  912. }
  913. /**
  914. * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常)
  915. *
  916. * @param loginId 指定账号id
  917. * @param service 指定封禁服务
  918. * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
  919. */
  920. public static void checkDisableLevel(Object loginId, String service, int level) {
  921. stpLogic.checkDisableLevel(loginId, service, level);
  922. }
  923. /**
  924. * 获取:指定账号被封禁的等级,如果未被封禁则返回-2
  925. *
  926. * @param loginId 指定账号id
  927. * @return /
  928. */
  929. public static int getDisableLevel(Object loginId) {
  930. return stpLogic.getDisableLevel(loginId);
  931. }
  932. /**
  933. * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2
  934. *
  935. * @param loginId 指定账号id
  936. * @param service 指定封禁服务
  937. * @return /
  938. */
  939. public static int getDisableLevel(Object loginId, String service) {
  940. return stpLogic.getDisableLevel(loginId, service);
  941. }
  942. // ------------------- 临时身份切换 -------------------
  943. /**
  944. * 临时切换身份为指定账号id
  945. *
  946. * @param loginId 指定loginId
  947. */
  948. public static void switchTo(Object loginId) {
  949. stpLogic.switchTo(loginId);
  950. }
  951. /**
  952. * 结束临时切换身份
  953. */
  954. public static void endSwitch() {
  955. stpLogic.endSwitch();
  956. }
  957. /**
  958. * 判断当前请求是否正处于 [ 身份临时切换 ] 中
  959. *
  960. * @return /
  961. */
  962. public static boolean isSwitch() {
  963. return stpLogic.isSwitch();
  964. }
  965. /**
  966. * 在一个 lambda 代码段里,临时切换身份为指定账号id,lambda 结束后自动恢复
  967. *
  968. * @param loginId 指定账号id
  969. * @param function 要执行的方法
  970. */
  971. public static void switchTo(Object loginId, SaFunction function) {
  972. stpLogic.switchTo(loginId, function);
  973. }
  974. // ------------------- 二级认证 -------------------
  975. /**
  976. * 在当前会话 开启二级认证
  977. *
  978. * @param safeTime 维持时间 (单位: 秒)
  979. */
  980. public static void openSafe(long safeTime) {
  981. stpLogic.openSafe(safeTime);
  982. }
  983. /**
  984. * 在当前会话 开启二级认证
  985. *
  986. * @param service 业务标识
  987. * @param safeTime 维持时间 (单位: 秒)
  988. */
  989. public static void openSafe(String service, long safeTime) {
  990. stpLogic.openSafe(service, safeTime);
  991. }
  992. /**
  993. * 判断:当前会话是否处于二级认证时间内
  994. *
  995. * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
  996. */
  997. public static boolean isSafe() {
  998. return stpLogic.isSafe();
  999. }
  1000. /**
  1001. * 判断:当前会话 是否处于指定业务的二级认证时间内
  1002. *
  1003. * @param service 业务标识
  1004. * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
  1005. */
  1006. public static boolean isSafe(String service) {
  1007. return stpLogic.isSafe(service);
  1008. }
  1009. /**
  1010. * 判断:指定 token 是否处于二级认证时间内
  1011. *
  1012. * @param tokenValue Token 值
  1013. * @param service 业务标识
  1014. * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
  1015. */
  1016. public static boolean isSafe(String tokenValue, String service) {
  1017. return stpLogic.isSafe(tokenValue, service);
  1018. }
  1019. /**
  1020. * 校验:当前会话是否已通过二级认证,如未通过则抛出异常
  1021. */
  1022. public static void checkSafe() {
  1023. stpLogic.checkSafe();
  1024. }
  1025. /**
  1026. * 校验:检查当前会话是否已通过指定业务的二级认证,如未通过则抛出异常
  1027. *
  1028. * @param service 业务标识
  1029. */
  1030. public static void checkSafe(String service) {
  1031. stpLogic.checkSafe(service);
  1032. }
  1033. /**
  1034. * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证)
  1035. *
  1036. * @return 剩余有效时间
  1037. */
  1038. public static long getSafeTime() {
  1039. return stpLogic.getSafeTime();
  1040. }
  1041. /**
  1042. * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证)
  1043. *
  1044. * @param service 业务标识
  1045. * @return 剩余有效时间
  1046. */
  1047. public static long getSafeTime(String service) {
  1048. return stpLogic.getSafeTime(service);
  1049. }
  1050. /**
  1051. * 在当前会话 结束二级认证
  1052. */
  1053. public static void closeSafe() {
  1054. stpLogic.closeSafe();
  1055. }
  1056. /**
  1057. * 在当前会话 结束指定业务标识的二级认证
  1058. *
  1059. * @param service 业务标识
  1060. */
  1061. public static void closeSafe(String service) {
  1062. stpLogic.closeSafe(service);
  1063. }
  1064. }