user.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import Vue from 'vue'
  2. import { getTenantsByQuery } from '@/api/user'
  3. import {
  4. Role,
  5. RoleAccess,
  6. Access
  7. } from '@/constant'
  8. const state = {
  9. token: '',
  10. tenantKey: '',
  11. tenantId: '',
  12. orgKey: '',
  13. id: '',
  14. name: '',
  15. avatar: '',
  16. roles: new Set(),
  17. accesses: new Set()
  18. }
  19. const mutations = {
  20. SET_TOKEN (state, token) {
  21. state.token = token
  22. },
  23. SET_TENANT_KEY (state, tenantKey) {
  24. console.log('tenant', tenantKey)
  25. state.tenantKey = tenantKey
  26. },
  27. SET_TENANT_ID (state, tenantId) {
  28. state.tenantId = tenantId
  29. },
  30. SET_ORG_KEY (state, orgKey) {
  31. console.log('org', orgKey)
  32. state.orgKey = orgKey
  33. },
  34. SET_ID (state, id) {
  35. console.log('user', id)
  36. state.id = id
  37. },
  38. SET_NAME (state, name) {
  39. state.name = name
  40. },
  41. SET_AVATAR (state, avatar) {
  42. state.avatar = avatar
  43. },
  44. SET_ROLES (state, roles) {
  45. console.log('roles', roles)
  46. state.roles = roles
  47. },
  48. SET_ACCESSES (state, accesses) {
  49. console.log('accesses', accesses)
  50. state.accesses = accesses
  51. }
  52. }
  53. function parseAccess (realmAccess, resourceAccess) {
  54. const roleSet = new Set([Role.VISITOR])
  55. const accessSet = new Set()
  56. if (realmAccess) {
  57. const roles = new Set(Object.values(Role))
  58. realmAccess.roles.forEach(role => {
  59. if (roles.has(role)) {
  60. roleSet.add(role)
  61. }
  62. })
  63. }
  64. roleSet.forEach(role => {
  65. RoleAccess[role].forEach(access => {
  66. accessSet.add(access)
  67. })
  68. })
  69. if (resourceAccess?.[process.env.VUE_APP_BACKEND_CLIENT]) {
  70. resourceAccess[process.env.VUE_APP_BACKEND_CLIENT].roles.forEach(role => {
  71. accessSet.add(role)
  72. })
  73. }
  74. return { roleSet, accessSet }
  75. }
  76. const actions = {
  77. async login ({ commit }, keycloak) {
  78. if (keycloak.authenticated) {
  79. const { tenant, sub, preferred_username, family_name, given_name, avatar } = keycloak.tokenParsed
  80. const { roleSet, accessSet } = parseAccess(keycloak.realmAccess, keycloak.resourceAccess)
  81. commit('SET_TOKEN', keycloak.token)
  82. if (tenant?.length) {
  83. tenant.sort((a, b) => a.length - b.length)
  84. commit('SET_TENANT_KEY', tenant[0])
  85. commit('SET_ORG_KEY', tenant[tenant.length - 1])
  86. } else if (accessSet.has(Access.MANAGE_TENANTS)) {
  87. try {
  88. const { data } = await getTenantsByQuery({ pageSize: 1, pageNum: 1 }, true)
  89. if (data.length) {
  90. commit('SET_TENANT_KEY', data[0].path)
  91. commit('SET_ORG_KEY', data[0].path)
  92. }
  93. } catch (e) {
  94. console.log(e)
  95. }
  96. }
  97. commit('SET_ID', sub)
  98. commit('SET_NAME', family_name && given_name
  99. ? /[a-zA-z]/.test(family_name)
  100. ? `${given_name} ${family_name}`
  101. : `${family_name}${given_name}`
  102. : preferred_username)
  103. commit('SET_AVATAR', avatar)
  104. commit('SET_ROLES', roleSet)
  105. commit('SET_ACCESSES', accessSet)
  106. }
  107. },
  108. logout () {
  109. // 登出将跳转页面,所以不需其他操作
  110. Vue.prototype.$keycloak.logout()
  111. },
  112. clearToken ({ commit }) {
  113. commit('SET_TOKEN', '')
  114. commit('SET_TENANT_ID', '')
  115. Vue.prototype.$keycloak.refreshToken = null
  116. }
  117. }
  118. export default {
  119. namespaced: true,
  120. state,
  121. mutations,
  122. actions
  123. }