From de29ae2b5d0851718b31b5be80b4a125fe262cf7 Mon Sep 17 00:00:00 2001 From: Misagh Moayyed Date: Sun, 4 Dec 2016 21:17:20 -0700 Subject: [PATCH] Add support for collections and iterables to authZ generators (#761) * Add support for collections and iterables to authZ generators * removed pmd issues * Add support for collections and iterables to authZ generators --- ...olesPermissionsAuthorizationGenerator.java | 8 +- .../FromAttributesAuthorizationGenerator.java | 84 ++++++++++--------- .../org/pac4j/core/profile/UserProfile.java | 47 ++++------- ...AttributesAuthorizationGeneratorTests.java | 34 +++++--- 4 files changed, 91 insertions(+), 82 deletions(-) diff --git a/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/DefaultRolesPermissionsAuthorizationGenerator.java b/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/DefaultRolesPermissionsAuthorizationGenerator.java index 33d9d166d0..ef2e1a99b6 100644 --- a/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/DefaultRolesPermissionsAuthorizationGenerator.java +++ b/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/DefaultRolesPermissionsAuthorizationGenerator.java @@ -3,7 +3,7 @@ import org.pac4j.core.profile.CommonProfile; import java.util.Arrays; -import java.util.List; +import java.util.Collection; /** * Grant default roles and/or permissions to a user profile. @@ -13,11 +13,11 @@ */ public class DefaultRolesPermissionsAuthorizationGenerator implements AuthorizationGenerator { - private final List defaultRoles; + private final Collection defaultRoles; - private final List defaultPermissions; + private final Collection defaultPermissions; - public DefaultRolesPermissionsAuthorizationGenerator(final List defaultRoles, final List defaultPermissions) { + public DefaultRolesPermissionsAuthorizationGenerator(final Collection defaultRoles, final Collection defaultPermissions) { this.defaultRoles = defaultRoles; this.defaultPermissions = defaultPermissions; } diff --git a/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGenerator.java b/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGenerator.java index 0aef1c154a..ee3ba4eaf0 100644 --- a/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGenerator.java +++ b/pac4j-core/src/main/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGenerator.java @@ -1,37 +1,42 @@ package org.pac4j.core.authorization.generator; +import org.pac4j.core.profile.CommonProfile; + import java.util.Arrays; import java.util.Collection; import java.util.StringTokenizer; -import org.pac4j.core.profile.CommonProfile; - /** *

Generate the authorization information by inspecting attributes.

*

The attributes containing the roles separated by the {@link #splitChar} property (can be set through {@link #setSplitChar(String)}) are * defined in the constructor. It's the same for the attributes containing the permissions.

- * + * * @author Jerome Leleu * @since 1.5.0 */ public class FromAttributesAuthorizationGenerator implements AuthorizationGenerator { - - private final String[] roleAttributes; - - private final String[] permissionAttributes; - + + private final Collection roleAttributes; + + private final Collection permissionAttributes; + private String splitChar = ","; - - public FromAttributesAuthorizationGenerator(final String[] roleAttributes, final String[] permissionAttributes) { - this.roleAttributes = copyArray(roleAttributes); - this.permissionAttributes = copyArray(permissionAttributes); + + public FromAttributesAuthorizationGenerator(final Collection roleAttributes, final Collection permissionAttributes) { + this.roleAttributes = roleAttributes; + this.permissionAttributes = permissionAttributes; } - private String[] copyArray(final String[] original) { - if (original != null) { - return Arrays.copyOf(original, original.length); + public FromAttributesAuthorizationGenerator(final String[] roleAttributes, final String[] permissionAttributes) { + if (roleAttributes != null) { + this.roleAttributes = Arrays.asList(roleAttributes); } else { - return null; + this.roleAttributes = null; + } + if (permissionAttributes != null) { + this.permissionAttributes = Arrays.asList(permissionAttributes); + } else { + this.permissionAttributes = null; } } @@ -39,34 +44,37 @@ public void generate(final U profile) { generateAuth(profile, this.roleAttributes, true); generateAuth(profile, this.permissionAttributes, false); } - - private void generateAuth(final U profile, final String[] attributes, final boolean isRole) { - if (attributes != null) { - for (final String attribute : attributes) { - final Object value = profile.getAttribute(attribute); - if (value != null) { - if(value instanceof String) { - final StringTokenizer st = new StringTokenizer((String) value, this.splitChar); - while (st.hasMoreTokens()) { - setAuth(profile, st.nextToken(), isRole); - } - } else if(value.getClass().isArray() && value.getClass().getComponentType().isAssignableFrom(String.class)) { - for(Object item : (Object[])value) { - setAuth(profile, item.toString(), isRole); - } - } else if(Collection.class.isAssignableFrom(value.getClass())) { - for(Object item : (Collection)value) { - if(item.getClass().isAssignableFrom(String.class)) { - setAuth(profile, item.toString(), isRole); - } + + private void generateAuth(final U profile, final Iterable attributes, final boolean isRole) { + if (attributes == null) { + return; + } + + for (final String attribute : attributes) { + final Object value = profile.getAttribute(attribute); + if (value != null) { + if (value instanceof String) { + final StringTokenizer st = new StringTokenizer((String) value, this.splitChar); + while (st.hasMoreTokens()) { + addRoleOrPermissionToProfile(profile, st.nextToken(), isRole); + } + } else if (value.getClass().isArray() && value.getClass().getComponentType().isAssignableFrom(String.class)) { + for (Object item : (Object[]) value) { + addRoleOrPermissionToProfile(profile, item.toString(), isRole); + } + } else if (Collection.class.isAssignableFrom(value.getClass())) { + for (Object item : (Collection) value) { + if (item.getClass().isAssignableFrom(String.class)) { + addRoleOrPermissionToProfile(profile, item.toString(), isRole); } } } } } + } - private void setAuth(final U profile, final String value, final boolean isRole) { + private void addRoleOrPermissionToProfile(final U profile, final String value, final boolean isRole) { if (isRole) { profile.addRole(value); } else { @@ -77,7 +85,7 @@ private void setAuth(final U profile, final String value, final boolean isRole) public String getSplitChar() { return this.splitChar; } - + public void setSplitChar(final String splitChar) { this.splitChar = splitChar; } diff --git a/pac4j-core/src/main/java/org/pac4j/core/profile/UserProfile.java b/pac4j-core/src/main/java/org/pac4j/core/profile/UserProfile.java index 493058d894..eb7ea59eef 100644 --- a/pac4j-core/src/main/java/org/pac4j/core/profile/UserProfile.java +++ b/pac4j-core/src/main/java/org/pac4j/core/profile/UserProfile.java @@ -14,7 +14,7 @@ /** * This class is the user profile retrieved from a provider after successful authentication: it's an identifier (string) and attributes * (objects). Additional concepts are the "remember me" nature of the user profile and the associated roles, permissions and client name. - * + * * @author Jerome Leleu * @since 1.0.0 */ @@ -40,7 +40,7 @@ public abstract class UserProfile implements Serializable, Externalizable { /** * Build a profile from user identifier and attributes. - * + * * @param id user identifier * @param attributes user attributes */ @@ -51,7 +51,7 @@ public void build(final Object id, final Map attributes) { /** * Add an attribute. - * + * * @param key key of the attribute * @param value value of the attribute */ @@ -64,7 +64,7 @@ public void addAttribute(final String key, Object value) { /** * Add attributes. - * + * * @param attributes use attributes */ public void addAttributes(final Map attributes) { @@ -87,7 +87,7 @@ public void removeAttribute(final String key) { /** * Set the identifier and convert it if necessary. - * + * * @param id user identifier */ public void setId(final Object id) { @@ -104,7 +104,7 @@ public void setId(final Object id) { /** * Get the user identifier. This identifier is unique for this provider but not necessarily through all providers. - * + * * @return the user identifier */ public String getId() { @@ -114,7 +114,7 @@ public String getId() { /** * Get the user identifier with a prefix which is the profile type (full class name with package). * This identifier is unique through all providers. - * + * * @return the typed user identifier */ public String getTypedId() { @@ -123,7 +123,7 @@ public String getTypedId() { /** * Get all attributes as immutable map. - * + * * @return the immutable attributes */ public Map getAttributes() { @@ -138,7 +138,7 @@ public Map getAttributes() { /** * Return the attribute with name. - * + * * @param name attribute name * @return the attribute with name */ @@ -184,7 +184,7 @@ public T getAttribute(final String name, final Class clazz) { /** * Add a role. - * + * * @param role the role to add. */ public void addRole(final String role) { @@ -197,7 +197,7 @@ public void addRole(final String role) { * * @param roles the roles to add. */ - public void addRoles(final List roles) { + public void addRoles(final Collection roles) { CommonHelper.assertNotNull("roles", roles); this.roles.addAll(roles); } @@ -214,7 +214,7 @@ public void addRoles(final Set roles) { /** * Add a permission. - * + * * @param permission the permission to add. */ public void addPermission(final String permission) { @@ -222,29 +222,18 @@ public void addPermission(final String permission) { this.permissions.add(permission); } - /** - * Add permissions. + /** Add permissions. * * @param permissions the permissions to add. */ - public void addPermissions(final List permissions) { - CommonHelper.assertNotNull("permissions", permissions); - this.permissions.addAll(permissions); - } - - /** - * Add permissions. - * - * @param permissions the permissions to add. - */ - public void addPermissions(final Set permissions) { + public void addPermissions(final Collection permissions) { CommonHelper.assertNotNull("permissions", permissions); this.permissions.addAll(permissions); } /** * Define if this profile is remembered. - * + * * @param rme whether the user is remembered. */ public void setRemembered(final boolean rme) { @@ -253,7 +242,7 @@ public void setRemembered(final boolean rme) { /** * Get the roles of the user. - * + * * @return the user roles. */ public Set getRoles() { @@ -262,7 +251,7 @@ public Set getRoles() { /** * Get the permissions of the user. - * + * * @return the user permissions. */ public Set getPermissions() { @@ -271,7 +260,7 @@ public Set getPermissions() { /** * Is the user remembered? - * + * * @return whether the user is remembered. */ public boolean isRemembered() { diff --git a/pac4j-core/src/test/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGeneratorTests.java b/pac4j-core/src/test/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGeneratorTests.java index 327ab5c73e..bb0e770c0c 100644 --- a/pac4j-core/src/test/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGeneratorTests.java +++ b/pac4j-core/src/test/java/org/pac4j/core/authorization/generator/FromAttributesAuthorizationGeneratorTests.java @@ -1,6 +1,7 @@ package org.pac4j.core.authorization.generator; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -8,6 +9,7 @@ import org.junit.Test; import org.pac4j.core.profile.CommonProfile; + import static org.junit.Assert.*; /** @@ -17,16 +19,16 @@ * @since 1.5.0 */ public final class FromAttributesAuthorizationGeneratorTests { - - private final static String ATTRIB1 = "attrib1"; - private final static String VALUE1 = "info11,info12"; - private final static String ATTRIB2 = "attrib2"; - private final static String VALUE2 = "info21,info22"; - private final static String ATTRIB3 = "attrib3"; - private final static String ATTRIB4 = "attrib4"; - private final static String ATTRIB5 = "attrib5"; - private final static String[] ATTRIB_ARRAY = new String[]{"infoA1", "infoA2", "infoA3"}; - private final static List ATTRIB_LIST = new ArrayList<>(); + + private static final String ATTRIB1 = "attrib1"; + private static final String VALUE1 = "info11,info12"; + private static final String ATTRIB2 = "attrib2"; + private static final String VALUE2 = "info21,info22"; + private static final String ATTRIB3 = "attrib3"; + private static final String ATTRIB4 = "attrib4"; + private static final String ATTRIB5 = "attrib5"; + private static final String[] ATTRIB_ARRAY = new String[]{"infoA1", "infoA2", "infoA3"}; + private static final List ATTRIB_LIST = new ArrayList<>(); static { ATTRIB_LIST.add("infoL1"); @@ -45,9 +47,19 @@ public void setUp() { this.profile.addAttribute(ATTRIB4, ATTRIB_LIST); } + @Test + public void testNoConfigWithCollections() { + final FromAttributesAuthorizationGenerator generator = + new FromAttributesAuthorizationGenerator<>(new ArrayList<>(), new HashSet<>()); + generator.generate(this.profile); + assertEquals(0, this.profile.getRoles().size()); + assertEquals(0, this.profile.getPermissions().size()); + } + @Test public void testNoConfig() { - final FromAttributesAuthorizationGenerator generator = new FromAttributesAuthorizationGenerator<>(null, null); + final FromAttributesAuthorizationGenerator generator = + new FromAttributesAuthorizationGenerator<>((String[]) null, (String[]) null); generator.generate(this.profile); assertEquals(0, this.profile.getRoles().size()); assertEquals(0, this.profile.getPermissions().size());