[IMPROVE] OAuth Role Sync (#13761)
parent
ea8bb4b9b4
commit
dd76eca129
@ -0,0 +1,42 @@ |
||||
import { addUserRoles, removeUserFromRoles } from '../../authorization'; |
||||
import { Roles } from '../../models'; |
||||
|
||||
|
||||
// Returns list of roles from SSO identity
|
||||
export function mapRolesFromSSO(identity, roleClaimName) { |
||||
let roles = []; |
||||
|
||||
if (identity && roleClaimName) { |
||||
// Adding roles
|
||||
if (identity[roleClaimName] && Array.isArray(identity[roleClaimName])) { |
||||
roles = identity[roleClaimName].filter((val) => val !== 'offline_access' && val !== 'uma_authorization' && Roles.findOneByIdOrName(val)); |
||||
} |
||||
} |
||||
|
||||
return roles; |
||||
} |
||||
|
||||
// Updates the user with roles from SSO identity
|
||||
export function updateRolesFromSSO(user, identity, roleClaimName) { |
||||
if (user && identity && roleClaimName) { |
||||
const rolesFromSSO = mapRolesFromSSO(identity, roleClaimName); |
||||
|
||||
if (!Array.isArray(user.roles)) { |
||||
user.roles = []; |
||||
} |
||||
|
||||
const toRemove = user.roles.filter((val) => !rolesFromSSO.includes(val)); |
||||
|
||||
// loop through roles that user has that sso doesnt have and remove
|
||||
toRemove.forEach(function(role) { |
||||
removeUserFromRoles(user._id, role); |
||||
}); |
||||
|
||||
const toAdd = rolesFromSSO.filter((val) => !user.roles.includes(val)); |
||||
|
||||
// loop through roles sso has that user doesnt and add
|
||||
toAdd.forEach(function(role) { |
||||
addUserRoles(user._id, role); |
||||
}); |
||||
} |
||||
} |
Loading…
Reference in new issue