import Vue from 'vue' import { resetRouter } from '@/router' import { Role } from '@/constant' const state = { token: '', name: '', avatar: '', roles: null, access: null } const mutations = { SET_TOKEN (state, token) { state.token = token }, SET_NAME (state, name) { state.name = name }, SET_AVATAR (state, avatar) { state.avatar = avatar }, SET_ROLES (state, roles) { state.roles = roles }, SET_ACCESSES (state, accesses) { state.accesses = accesses } } function parseRealmAccess (realmAccess) { const roleSet = new Set() if (realmAccess) { const roleArray = Object.values(Role) realmAccess.roles.forEach(role => { if (roleArray.includes(role)) { roleSet.add(role) } }) } if (!roleSet.size) { roleSet.add(Role.VISITOR) } return roleSet } function parseResourceAccess (resourceAccess) { const accessSet = new Set() if (resourceAccess) { Object.keys(resourceAccess).forEach(client => { resourceAccess[client].roles.forEach(role => { accessSet.add(`${client}:${role}`) }) }) } return accessSet } const actions = { login ({ commit }, keycloak) { if (keycloak.authenticated) { const { preferred_username, family_name, given_name, avatar } = keycloak.tokenParsed commit('SET_TOKEN', keycloak.token) commit('SET_ROLES', parseRealmAccess(keycloak.realmAccess)) commit('SET_ACCESSES', parseResourceAccess(keycloak.resourceAccess)) commit('SET_NAME', family_name && given_name ? `${family_name}${/[a-zA-z]/.test(family_name) ? ' ' : ''}${given_name}` : preferred_username) commit('SET_AVATAR', avatar) } }, logout ({ dispatch }) { // 登出将跳转页面,所以不需其他操作 Vue.prototype.$keycloak.logout() dispatch('clearToken') }, clearToken ({ commit }) { commit('SET_TOKEN', '') Vue.prototype.$keycloak.refreshToken = null resetRouter() } } export default { namespaced: true, state, mutations, actions }