|
|
@@ -6,7 +6,8 @@ const state = {
|
|
|
token: '',
|
|
|
name: '',
|
|
|
avatar: '',
|
|
|
- roles: []
|
|
|
+ roles: null,
|
|
|
+ access: null
|
|
|
}
|
|
|
|
|
|
const mutations = {
|
|
|
@@ -21,32 +22,58 @@ const mutations = {
|
|
|
},
|
|
|
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)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ 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 roleArray = Object.values(Role)
|
|
|
- const roles = keycloak.realmAccess?.roles?.filter(role => roleArray.includes(role))
|
|
|
const { preferred_username, family_name, given_name, avatar } = keycloak.tokenParsed
|
|
|
commit('SET_TOKEN', keycloak.token)
|
|
|
- commit('SET_ROLES', roles?.length ? roles : [Role.VISITOR])
|
|
|
+ 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 ({ commit }) {
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- Vue.prototype.$keycloak.logout().then(() => {
|
|
|
- commit('SET_TOKEN', '')
|
|
|
- commit('SET_ROLES', [])
|
|
|
- commit('SET_NAME', '')
|
|
|
- commit('SET_AVATAR', '')
|
|
|
- resetRouter()
|
|
|
- resolve()
|
|
|
- }, reject)
|
|
|
+ return new Promise(resolve => {
|
|
|
+ // 登出将跳转页面,所以不需其他操作
|
|
|
+ Vue.prototype.$keycloak.logout()
|
|
|
+ commit('SET_TOKEN', '')
|
|
|
+ resetRouter()
|
|
|
+ resolve()
|
|
|
})
|
|
|
}
|
|
|
}
|