Skip to content

Commit

Permalink
feat(authn/saml): Allow role sorting and lowercase configuration (#1381)
Browse files Browse the repository at this point in the history
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
gavinbunney and mergify[bot] committed Oct 28, 2020
1 parent 2b1a825 commit a3263da
Showing 1 changed file with 14 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ class SamlSsoConfig extends WebSecurityConfigurerAdapter {
String issuerId

List<String> requiredRoles
boolean sortRoles = false
boolean forceLowercaseRoles = true
UserAttributeMapping userAttributeMapping = new UserAttributeMapping()
long maxAuthenticationAge = 7200

Expand Down Expand Up @@ -239,7 +241,11 @@ class SamlSsoConfig extends WebSecurityConfigurerAdapter {
def subjectNameId = assertion.getSubject().nameID.value
def email = attributes[userAttributeMapping.email]?.get(0) ?: subjectNameId
String username = attributes[userAttributeMapping.username]?.get(0) ?: subjectNameId
def roles = extractRoles(email, attributes, userAttributeMapping)
def roles = extractRoles(email, attributes, userAttributeMapping, samlSecurityConfigProperties.forceLowercaseRoles)

if (samlSecurityConfigProperties.sortRoles) {
roles = roles.sort()
}

if (samlSecurityConfigProperties.requiredRoles) {
if (!samlSecurityConfigProperties.requiredRoles.any { it in roles }) {
Expand Down Expand Up @@ -288,13 +294,18 @@ class SamlSsoConfig extends WebSecurityConfigurerAdapter {

Set<String> extractRoles(String email,
Map<String, List<String>> attributes,
UserAttributeMapping userAttributeMapping) {
UserAttributeMapping userAttributeMapping,
boolean forceLowercaseRoles) {
def assertionRoles = attributes[userAttributeMapping.roles].collect { String roles ->
def commonNames = roles.split(userAttributeMapping.rolesDelimiter)
commonNames.collect {
return it.indexOf("CN=") < 0 ? it : it.substring(it.indexOf("CN=") + 3, it.indexOf(","))
}
}.flatten()*.toLowerCase() as Set<String>
}.flatten() as Set<String>

if (forceLowercaseRoles) {
assertionRoles = assertionRoles*.toLowerCase()
}

return assertionRoles
}
Expand Down

0 comments on commit a3263da

Please sign in to comment.