user.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import Vue from 'vue'
  2. import { resetRouter } from '@/router'
  3. import { Role } from '@/constant'
  4. const state = {
  5. token: '',
  6. name: '',
  7. avatar: '',
  8. roles: null,
  9. access: null
  10. }
  11. const mutations = {
  12. SET_TOKEN (state, token) {
  13. state.token = token
  14. },
  15. SET_NAME (state, name) {
  16. state.name = name
  17. },
  18. SET_AVATAR (state, avatar) {
  19. state.avatar = avatar
  20. },
  21. SET_ROLES (state, roles) {
  22. state.roles = roles
  23. },
  24. SET_ACCESSES (state, accesses) {
  25. state.accesses = accesses
  26. }
  27. }
  28. function parseRealmAccess (realmAccess) {
  29. const roleSet = new Set()
  30. if (realmAccess) {
  31. const roleArray = Object.values(Role)
  32. realmAccess.roles.forEach(role => {
  33. if (roleArray.includes(role)) {
  34. roleSet.add(role)
  35. }
  36. })
  37. }
  38. if (!roleSet.size) {
  39. roleSet.add(Role.VISITOR)
  40. }
  41. return roleSet
  42. }
  43. function parseResourceAccess (resourceAccess) {
  44. const accessSet = new Set()
  45. if (resourceAccess) {
  46. Object.keys(resourceAccess).forEach(client => {
  47. resourceAccess[client].roles.forEach(role => {
  48. accessSet.add(`${client}:${role}`)
  49. })
  50. })
  51. }
  52. return accessSet
  53. }
  54. const actions = {
  55. login ({ commit }, keycloak) {
  56. if (keycloak.authenticated) {
  57. const { preferred_username, family_name, given_name, avatar } = keycloak.tokenParsed
  58. commit('SET_TOKEN', keycloak.token)
  59. commit('SET_ROLES', parseRealmAccess(keycloak.realmAccess))
  60. commit('SET_ACCESSES', parseResourceAccess(keycloak.resourceAccess))
  61. commit('SET_NAME', family_name && given_name ? `${family_name}${/[a-zA-z]/.test(family_name) ? ' ' : ''}${given_name}` : preferred_username)
  62. commit('SET_AVATAR', avatar)
  63. }
  64. },
  65. logout ({ dispatch }) {
  66. // 登出将跳转页面,所以不需其他操作
  67. Vue.prototype.$keycloak.logout()
  68. dispatch('clearToken')
  69. },
  70. clearToken ({ commit }) {
  71. commit('SET_TOKEN', '')
  72. Vue.prototype.$keycloak.refreshToken = null
  73. resetRouter()
  74. }
  75. }
  76. export default {
  77. namespaced: true,
  78. state,
  79. mutations,
  80. actions
  81. }