sso.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { removeToken, setToken, type DataInfo } from "./auth";
  2. import { subBefore, getQueryMap } from "@pureadmin/utils";
  3. /**
  4. * 简版前端单点登录,根据实际业务自行编写,平台启动后本地可以跳后面这个链接进行测试 http://localhost:8848/#/permission/page/index?username=sso&roles=admin&accessToken=eyJhbGciOiJIUzUxMiJ9.admin
  5. * 划重点:
  6. * 判断是否为单点登录,不为则直接返回不再进行任何逻辑处理,下面是单点登录后的逻辑处理
  7. * 1.清空本地旧信息;
  8. * 2.获取url中的重要参数信息,然后通过 setToken 保存在本地;
  9. * 3.删除不需要显示在 url 的参数
  10. * 4.使用 window.location.replace 跳转正确页面
  11. */
  12. (function () {
  13. // 获取 url 中的参数
  14. const params = getQueryMap(location.href) as DataInfo<Date>;
  15. const must = ["username", "roles", "accessToken"];
  16. const mustLength = must.length;
  17. if (Object.keys(params).length !== mustLength) return;
  18. // url 参数满足 must 里的全部值,才判定为单点登录,避免非单点登录时刷新页面无限循环
  19. let sso = [];
  20. let start = 0;
  21. while (start < mustLength) {
  22. if (Object.keys(params).includes(must[start]) && sso.length <= mustLength) {
  23. sso.push(must[start]);
  24. } else {
  25. sso = [];
  26. }
  27. start++;
  28. }
  29. if (sso.length === mustLength) {
  30. // 判定为单点登录
  31. // 清空本地旧信息
  32. removeToken();
  33. // 保存新信息到本地
  34. setToken(params);
  35. // 删除不需要显示在 url 的参数
  36. delete params.roles;
  37. delete params.accessToken;
  38. const newUrl = `${location.origin}${location.pathname}${subBefore(
  39. location.hash,
  40. "?"
  41. )}?${JSON.stringify(params)
  42. .replace(/["{}]/g, "")
  43. .replace(/:/g, "=")
  44. .replace(/,/g, "&")}`;
  45. // 替换历史记录项
  46. window.location.replace(newUrl);
  47. } else {
  48. return;
  49. }
  50. })();