Skip to content

Commit bce5d3a

Browse files
committed
Added support for saml roles attribute
1 parent 09bb590 commit bce5d3a

1 file changed

Lines changed: 21 additions & 5 deletions

File tree

src/main/java/eu/openanalytics/containerproxy/auth/impl/saml/SAMLConfiguration.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package eu.openanalytics.containerproxy.auth.impl.saml;
22

33
import java.util.ArrayList;
4+
import java.util.Arrays;
45
import java.util.Collection;
5-
import java.util.Collections;
66
import java.util.List;
77
import java.util.Timer;
88

@@ -23,6 +23,8 @@
2323
import org.springframework.context.annotation.Lazy;
2424
import org.springframework.core.env.Environment;
2525
import org.springframework.security.authentication.AuthenticationManager;
26+
import org.springframework.security.core.GrantedAuthority;
27+
import org.springframework.security.core.authority.SimpleGrantedAuthority;
2628
import org.springframework.security.core.userdetails.User;
2729
import org.springframework.security.core.userdetails.UsernameNotFoundException;
2830
import org.springframework.security.saml.SAMLAuthenticationProvider;
@@ -63,6 +65,8 @@
6365
@ConditionalOnProperty(name="proxy.authentication", havingValue="saml")
6466
public class SAMLConfiguration {
6567

68+
private static final String DEFAULT_NAME_ATTRIBUTE = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
69+
6670
@Inject
6771
private Environment environment;
6872

@@ -254,10 +258,22 @@ public SAMLAuthenticationProvider samlAuthenticationProvider() {
254258
samlAuthenticationProvider.setUserDetails(new SAMLUserDetailsService() {
255259
@Override
256260
public Object loadUserBySAML(SAMLCredential credential) throws UsernameNotFoundException {
257-
//TODO The claim to use as username should be configurable
258-
String claimName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
259-
String claimValue = credential.getAttributeAsString(claimName);
260-
return new User(claimValue, "", Collections.emptyList());
261+
String nameAttribute = environment.getProperty("proxy.saml.name-attribute", DEFAULT_NAME_ATTRIBUTE);
262+
String nameValue = credential.getAttributeAsString(nameAttribute);
263+
if (nameValue == null) throw new UsernameNotFoundException("Name attribute missing from SAML assertion: " + nameAttribute);
264+
265+
List<GrantedAuthority> auth = new ArrayList<>();
266+
String rolesAttribute = environment.getProperty("proxy.saml.roles-attribute");
267+
if (rolesAttribute != null && !rolesAttribute.trim().isEmpty()) {
268+
String[] roles = credential.getAttributeAsStringArray(rolesAttribute);
269+
if (roles != null && roles.length > 0) {
270+
Arrays.stream(roles)
271+
.map(r -> "ROLE_" + r.toUpperCase())
272+
.forEach(a -> auth.add(new SimpleGrantedAuthority(a)));
273+
}
274+
}
275+
276+
return new User(nameValue, "", auth);
261277
}
262278
});
263279
samlAuthenticationProvider.setForcePrincipalAsString(false);

0 commit comments

Comments
 (0)