From 5de0f3b8f0351ac09bdefb79569264dd77c42f3b Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Wed, 19 Mar 2008 15:45:42 +0000 Subject: [PATCH] SEC-719: Refactor portlet code to make more use of core classes http://jira.springframework.org/browse/SEC-719. Rewrote provider as a preauthenticated provider. --- ...tSessionContextIntegrationInterceptor.java | 1 - .../PortletAuthenticationProvider.java | 198 ------------------ .../portlet/PortletAuthenticationToken.java | 57 ----- .../portlet/PortletAuthoritiesPopulator.java | 45 ---- .../security/providers/portlet/package.html | 5 - .../ContainerPortletAuthoritiesPopulator.java | 144 ------------- .../DaoPortletAuthoritiesPopulator.java | 74 ------- .../providers/portlet/populator/package.html | 5 - .../portlet/PortletAuthenticationDetails.java | 33 +++ ...PreAuthenticatedAuthenticationDetails.java | 37 ++++ ...henticatedAuthenticationDetailsSource.java | 27 +++ .../PortletProcessingFilterEntryPoint.java | 43 +--- .../portlet/PortletProcessingInterceptor.java | 61 ++++-- ...ionContextIntegrationInterceptorTests.java | 24 +-- .../PortletAuthenticationProviderTests.java | 117 ----------- .../PortletAuthenticationTokenTests.java | 63 ------ .../providers/portlet/PortletTestUtils.java | 32 +-- ...ainerPortletAuthoritiesPopulatorTests.java | 127 ----------- .../DaoPortletAuthoritiesPopulatorTests.java | 100 --------- ...ortletProcessingFilterEntryPointTests.java | 60 ------ .../PortletProcessingInterceptorTests.java | 15 +- 21 files changed, 166 insertions(+), 1102 deletions(-) delete mode 100644 portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationProvider.java delete mode 100644 portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationToken.java delete mode 100644 portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthoritiesPopulator.java delete mode 100644 portlet/src/main/java/org/springframework/security/providers/portlet/package.html delete mode 100644 portlet/src/main/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulator.java delete mode 100644 portlet/src/main/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulator.java delete mode 100644 portlet/src/main/java/org/springframework/security/providers/portlet/populator/package.html create mode 100644 portlet/src/main/java/org/springframework/security/ui/portlet/PortletAuthenticationDetails.java create mode 100644 portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetails.java create mode 100644 portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetailsSource.java delete mode 100644 portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationProviderTests.java delete mode 100644 portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationTokenTests.java delete mode 100644 portlet/src/test/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulatorTests.java delete mode 100644 portlet/src/test/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulatorTests.java delete mode 100644 portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPointTests.java diff --git a/portlet/src/main/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptor.java b/portlet/src/main/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptor.java index b93a5f1011..1ddec5c293 100644 --- a/portlet/src/main/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptor.java +++ b/portlet/src/main/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptor.java @@ -367,7 +367,6 @@ public class PortletSessionContextIntegrationInterceptor } - /** * Creates a new SecurityContext object. The specific class is * determined by the setting of the {@link #context} property. diff --git a/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationProvider.java b/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationProvider.java deleted file mode 100644 index 63a3f63f38..0000000000 --- a/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationProvider.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet; - -import java.security.Principal; -import java.util.Map; - -import javax.portlet.PortletRequest; - -import org.springframework.security.Authentication; -import org.springframework.security.AuthenticationException; -import org.springframework.security.AuthenticationServiceException; -import org.springframework.security.BadCredentialsException; -import org.springframework.security.providers.AuthenticationProvider; -import org.springframework.security.providers.dao.UserCache; -import org.springframework.security.providers.dao.cache.NullUserCache; -import org.springframework.security.userdetails.UserDetails; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.util.Assert; - -/** - *

Processes a JSR 168 Portlet authentication request. The request will typically - * originate from {@link org.springframework.security.ui.portlet.PortletProcessingInterceptor}.

- * - *

Be aware that this provider is trusting the portal and portlet container to handle - * actual authentication. If a valid {@link PortletAuthenticationToken} is presented with - * non-null principal and credentials, then the {@link #authenticate} method will succeed.

- * - *

If the details property of the requesting Authentication - * object happens to be the PortletRequest, then this provider will place - * the contents of the USER_INFO map from of the request attributes into - * the details property of the authentication result.

- * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class PortletAuthenticationProvider - implements AuthenticationProvider, InitializingBean { - - //~ Static fields/initializers ===================================================================================== - - private static final Log logger = LogFactory.getLog(PortletAuthenticationProvider.class); - - //~ Instance fields ================================================================================================ - - private PortletAuthoritiesPopulator portletAuthoritiesPopulator; - private UserCache userCache = new NullUserCache(); - - //~ Methods ======================================================================================================== - - public void afterPropertiesSet() throws Exception { - Assert.notNull(this.portletAuthoritiesPopulator, "An authorities populator must be set"); - Assert.notNull(this.userCache, "A user cache must be set"); - } - - public boolean supports(Class authentication) { - return PortletAuthenticationToken.class.isAssignableFrom(authentication); - } - - public Authentication authenticate(Authentication authentication) throws AuthenticationException { - - // make sure we support the authentication - if (!supports(authentication.getClass())) { - return null; - } - - if (logger.isDebugEnabled()) - logger.debug("portlet authentication request: " + authentication); - - // make sure there is a valid principal in the authentication attempt - Object principal = authentication.getPrincipal(); - if (principal == null) { - throw new BadCredentialsException("No principal presented - user is not authenticated"); - } - - // make sure there are valid credentials in the authentication attempt - Object credentials = authentication.getCredentials(); - if (credentials == null) { - throw new BadCredentialsException("No credentials presented - user is not authenticated"); - } - - // determine the username string from the principal - String username = getUsernameFromPrincipal(principal); - if (username == null) { - throw new BadCredentialsException("No username available - user is not authenticated"); - } - - // try to retrieve the user from the cache - UserDetails user = this.userCache.getUserFromCache(username); - - // if the user is null then it wasn't in the cache so go get it - if (user == null) { - - if (logger.isDebugEnabled()) - logger.debug("user not found in the cache"); - - // get the user from the authorities populator - user = this.portletAuthoritiesPopulator.getUserDetails(authentication); - - if (user == null) { - throw new AuthenticationServiceException( - "portletAuthoritiesPopulator returned null, which is an interface contract violation"); - } - - // store the result back in the cache - this.userCache.putUserInCache(user); - - } else { - - if (logger.isDebugEnabled()) - logger.debug("got user from the cache"); - } - - // build the resulting successful authentication token - PortletAuthenticationToken result = new PortletAuthenticationToken( - user, authentication.getCredentials(), user.getAuthorities()); - result.setAuthenticated(true); - - // see if the detail property on the request is the PortletRequest - if (authentication.getDetails() instanceof PortletRequest) { - // if available, place the USER_INFO map into the details property of the result - PortletRequest request = (PortletRequest)authentication.getDetails(); - Map userInfo = null; - try { - userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO); - } catch (Exception e) { - logger.warn("unable to retrieve USER_INFO map from portlet request", e); - } - result.setDetails(userInfo); - } else { - // copy any other details information forward - result.setDetails(authentication.getDetails()); - } - - if (logger.isDebugEnabled()) - logger.debug("portlet authentication succeeded: " + result); - - return result; - } - - /** - * This method attempt to determine the username string from the principal object. - * If the principal object is a {@link UserDetails} object then it will use the - * {@link UserDetails#getUsername() method. If the principal object is a - * {@link Principal} object then it will use the {@link Principal#getName()} - * method. Otherwise it will simply call the toString() method - * on the principal object and return that. - * @param principal the principal object to inspect for a username - * @return the determined username, or null if no principal is passed - */ - public static final String getUsernameFromPrincipal(Object principal) { - if (principal == null) { - return null; - } - if (principal instanceof UserDetails) { - return ((UserDetails)principal).getUsername(); - } - if (principal instanceof Principal) { - return ((Principal)principal).getName(); - } - return principal.toString(); - } - - - public PortletAuthoritiesPopulator getPortletAuthoritiesPopulator() { - return this.portletAuthoritiesPopulator; - } - - public void setPortletAuthoritiesPopulator(PortletAuthoritiesPopulator portletAuthoritiesPopulator) { - this.portletAuthoritiesPopulator = portletAuthoritiesPopulator; - } - - public UserCache getUserCache() { - return userCache; - } - - public void setUserCache(UserCache userCache) { - this.userCache = userCache; - } - -} diff --git a/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationToken.java b/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationToken.java deleted file mode 100644 index b031e03f94..0000000000 --- a/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthenticationToken.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet; - -import org.springframework.security.GrantedAuthority; -import org.springframework.security.providers.AbstractAuthenticationToken; - -/** - * Authentication implementation for JSR 168 Portlet authentication.

The - * corresponding authentication provider is {@link PortletAuthenticationProvider}.

- * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class PortletAuthenticationToken extends AbstractAuthenticationToken { - - //~ Instance fields ================================================================================================ - - private static final long serialVersionUID = 1L; - - private Object principal; - private Object credentials; - - //~ Constructors =================================================================================================== - - public PortletAuthenticationToken(Object principal, Object credentials, GrantedAuthority[] authorities) { - super(authorities); - this.principal = principal; - this.credentials = credentials; - } - - //~ Methods ======================================================================================================== - - public Object getPrincipal() { - return this.principal; - } - - public Object getCredentials() { - return this.credentials; - } - -} diff --git a/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthoritiesPopulator.java b/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthoritiesPopulator.java deleted file mode 100644 index 5d92544d13..0000000000 --- a/portlet/src/main/java/org/springframework/security/providers/portlet/PortletAuthoritiesPopulator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet; - -import org.springframework.security.Authentication; -import org.springframework.security.AuthenticationException; -import org.springframework.security.userdetails.UserDetails; - -/** - * Populates the UserDetails associated with the - * portlet user presented by the portlet container. - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public interface PortletAuthoritiesPopulator { - - //~ Methods ======================================================================================================== - - /** - * Obtains the granted authorities for the specified Authentication object. - *

May throw any AuthenticationException or return null - * if the authorities are unavailable.

- * @param authentication the authentication object seeking authorities - * @return the details of the indicated user (at minimum the granted authorities and the username) - * @throws AuthenticationException if the user details are not available or the authentication is not valid for some reason - */ - public UserDetails getUserDetails(Authentication authentication) throws AuthenticationException; - -} diff --git a/portlet/src/main/java/org/springframework/security/providers/portlet/package.html b/portlet/src/main/java/org/springframework/security/providers/portlet/package.html deleted file mode 100644 index 51d7198b46..0000000000 --- a/portlet/src/main/java/org/springframework/security/providers/portlet/package.html +++ /dev/null @@ -1,5 +0,0 @@ - - -An authentication provider that can uses the security model in the Portlet 1.0 (JSR 168) Specification. - - diff --git a/portlet/src/main/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulator.java b/portlet/src/main/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulator.java deleted file mode 100644 index d48a2ec48a..0000000000 --- a/portlet/src/main/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulator.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet.populator; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.portlet.PortletRequest; - -import org.springframework.security.Authentication; -import org.springframework.security.AuthenticationException; -import org.springframework.security.AuthenticationServiceException; -import org.springframework.security.GrantedAuthority; -import org.springframework.security.GrantedAuthorityImpl; -import org.springframework.security.providers.portlet.PortletAuthenticationProvider; -import org.springframework.security.providers.portlet.PortletAuthoritiesPopulator; -import org.springframework.security.userdetails.User; -import org.springframework.security.userdetails.UserDetails; - -/** - *

Populates the portlet authorities via role information from the portlet container. - * Primarily it uses the PortletRequest.isUserInRole(role) method to - * check if the user is in a list of configured roles.

- * - *

This bean has the following configurable properties:

- *
    - *
  • rolesToCheck : A list of strings containing names of roles to check. - * These roles must also be properly declared in a <security-role-ref> element - * of the portlet descriptor in the portlet.xml file.
  • - *
  • rolePrefix : The prefix to be added onto each role name that as it is - * added to the list of authorities. The default value is 'ROLE_'.
  • - *
  • userRole : The authority that all authenticated users will automatically - * be granted. The default value is 'ROLE_USER'. Set this to null to avoid having any - * value automatically populated.
  • - *
- * - *

This populator depends on finding the PortletRequest when calling the - * {@link Authentication#getDetails()} method on the object passed to - * {@link #getUserDetails(Authentication)}. If not, it will throw an - * {@link AuthenticationServiceException}. - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class ContainerPortletAuthoritiesPopulator - implements PortletAuthoritiesPopulator { - - //~ Static fields/initializers ===================================================================================== - - public static final String DEFAULT_ROLE_PREFIX = "ROLE_"; - public static final String DEFAULT_USER_ROLE = "ROLE_USER"; - - //~ Instance fields ================================================================================================ - - private List rolesToCheck; - private String rolePrefix = DEFAULT_ROLE_PREFIX; - private String userRole = DEFAULT_USER_ROLE; - - //~ Methods ======================================================================================================== - - public UserDetails getUserDetails(Authentication authentication) - throws AuthenticationException { - - // get the username and password for the authentication - String username = PortletAuthenticationProvider.getUsernameFromPrincipal(authentication.getPrincipal()); - String password = authentication.getCredentials().toString(); - - // see if we can load authorities from the portlet request - Object details = authentication.getDetails(); - if (!(details instanceof PortletRequest)) { - throw new AuthenticationServiceException("expected Authentication.getDetails() to return a PortletRequest"); - } - GrantedAuthority[] authorities = loadGrantedAuthorities((PortletRequest)details); - - // construct and return the new user - return new User(username, password, true, true, true, true, authorities); - } - - private GrantedAuthority[] loadGrantedAuthorities(PortletRequest request) { - - // start the list and add the standard user role - ArrayList authorities = new ArrayList(); - if (this.userRole != null && this.userRole.length() > 0) - authorities.add(new GrantedAuthorityImpl(getUserRole())); - - // iterate through the configured list of roles to check (if there is one) - if (this.rolesToCheck != null) { - for(Iterator i = this.rolesToCheck.iterator(); i.hasNext(); ) { - String role = (String)i.next(); - - // if the request says the user has that role, then add it - if (request.isUserInRole(role)) { - authorities.add(new GrantedAuthorityImpl(getRolePrefix() + role)); - } - - } - } - - // return the array of GrantedAuthority objects - return (GrantedAuthority[])authorities.toArray(new GrantedAuthority[authorities.size()]); - } - - - public List getRolesToCheck() { - return rolesToCheck; - } - - public void setRolesToCheck(List rolesToCheck) { - this.rolesToCheck = rolesToCheck; - } - - public String getRolePrefix() { - return rolePrefix; - } - - public void setRolePrefix(String rolePrefix) { - this.rolePrefix = rolePrefix; - } - - public String getUserRole() { - return userRole; - } - - public void setUserRole(String userRole) { - this.userRole = userRole; - } - -} diff --git a/portlet/src/main/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulator.java b/portlet/src/main/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulator.java deleted file mode 100644 index 2e76a9ef94..0000000000 --- a/portlet/src/main/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulator.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet.populator; - -import org.springframework.security.Authentication; -import org.springframework.security.AuthenticationException; -import org.springframework.security.AuthenticationServiceException; -import org.springframework.security.providers.portlet.PortletAuthenticationProvider; -import org.springframework.security.providers.portlet.PortletAuthoritiesPopulator; -import org.springframework.security.userdetails.UserDetails; -import org.springframework.security.userdetails.UserDetailsService; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.util.Assert; - -/** - * Populates the portlet authorities via a {@link UserDetailsService}. - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class DaoPortletAuthoritiesPopulator - implements PortletAuthoritiesPopulator, InitializingBean { - - //~ Instance fields ================================================================================================ - - private UserDetailsService userDetailsService; - - //~ Methods ======================================================================================================== - - public void afterPropertiesSet() throws Exception { - Assert.notNull(this.userDetailsService, "A userDetailsService must be set"); - } - - public UserDetails getUserDetails(Authentication authentication) - throws AuthenticationException { - - // make sure the Authentication object is valid - if (authentication == null || authentication.getPrincipal() == null) { - throw new AuthenticationServiceException( - "must pass valid Authentication object with non-null principal"); - } - - // get the username from the principal - String username = PortletAuthenticationProvider.getUsernameFromPrincipal(authentication.getPrincipal()); - - // call the UserDetailsService with the username - return this.userDetailsService.loadUserByUsername(username); - } - - - public UserDetailsService getUserDetailsService() { - return userDetailsService; - } - - public void setUserDetailsService(UserDetailsService userDetailsService) { - this.userDetailsService = userDetailsService; - } - -} diff --git a/portlet/src/main/java/org/springframework/security/providers/portlet/populator/package.html b/portlet/src/main/java/org/springframework/security/providers/portlet/populator/package.html deleted file mode 100644 index 7cdd20f7e7..0000000000 --- a/portlet/src/main/java/org/springframework/security/providers/portlet/populator/package.html +++ /dev/null @@ -1,5 +0,0 @@ - - -Implementations that populate GrantedAuthority[]s of Portlet authentications. - - diff --git a/portlet/src/main/java/org/springframework/security/ui/portlet/PortletAuthenticationDetails.java b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletAuthenticationDetails.java new file mode 100644 index 0000000000..832061fc4c --- /dev/null +++ b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletAuthenticationDetails.java @@ -0,0 +1,33 @@ +package org.springframework.security.ui.portlet; + +import java.io.Serializable; +import java.util.Map; + +import javax.portlet.PortletRequest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class PortletAuthenticationDetails implements Serializable { + //~ Instance fields ================================================================================================ + protected final Log logger = LogFactory.getLog(PortletAuthenticationDetails.class); + protected Map userInfo; + + //~ Constructors =================================================================================================== + + public PortletAuthenticationDetails(PortletRequest request) { + try { + userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO); + } catch (Exception e) { + logger.warn("unable to retrieve USER_INFO map from portlet request", e); + } + } + + public Map getUserInfo() { + return userInfo; + } + + public String toString() { + return "User info: " + userInfo.toString(); + } +} diff --git a/portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetails.java b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetails.java new file mode 100644 index 0000000000..8a818f8b94 --- /dev/null +++ b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetails.java @@ -0,0 +1,37 @@ +package org.springframework.security.ui.portlet; + +import java.util.Arrays; + +import javax.portlet.PortletRequest; + +import org.springframework.security.GrantedAuthority; +import org.springframework.security.MutableGrantedAuthoritiesContainer; +import org.springframework.util.Assert; + +public class PortletPreAuthenticatedAuthenticationDetails extends PortletAuthenticationDetails implements MutableGrantedAuthoritiesContainer { + + private GrantedAuthority[] preAuthenticatedGrantedAuthorities = null; + + public PortletPreAuthenticatedAuthenticationDetails(PortletRequest request) { + super(request); + } + + public GrantedAuthority[] getGrantedAuthorities() { + Assert.notNull(preAuthenticatedGrantedAuthorities, "Pre-authenticated granted authorities have not been set"); + GrantedAuthority[] result = new GrantedAuthority[preAuthenticatedGrantedAuthorities.length]; + System.arraycopy(preAuthenticatedGrantedAuthorities, 0, result, 0, result.length); + return result; + } + + public void setGrantedAuthorities(GrantedAuthority[] authorities) { + this.preAuthenticatedGrantedAuthorities = new GrantedAuthority[authorities.length]; + System.arraycopy(authorities, 0, preAuthenticatedGrantedAuthorities, 0, preAuthenticatedGrantedAuthorities.length); + } + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(super.toString() + "; "); + sb.append("preAuthenticatedGrantedAuthorities: " + Arrays.asList(preAuthenticatedGrantedAuthorities)); + return sb.toString(); + } +} diff --git a/portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetailsSource.java b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetailsSource.java new file mode 100644 index 0000000000..dff1386768 --- /dev/null +++ b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletPreAuthenticatedAuthenticationDetailsSource.java @@ -0,0 +1,27 @@ +package org.springframework.security.ui.portlet; + +import java.util.ArrayList; + +import javax.portlet.PortletRequest; + +import org.springframework.security.ui.preauth.j2ee.AbstractPreAuthenticatedAuthenticationDetailsSource; + +public class PortletPreAuthenticatedAuthenticationDetailsSource extends AbstractPreAuthenticatedAuthenticationDetailsSource { + + public PortletPreAuthenticatedAuthenticationDetailsSource() { + setClazz(PortletPreAuthenticatedAuthenticationDetails.class); + } + + protected String[] getUserRoles(Object context, String[] mappableRoles) { + ArrayList portletRoles = new ArrayList(); + + for (int i = 0; i < mappableRoles.length; i++) { + if (((PortletRequest)context).isUserInRole(mappableRoles[i])) { + portletRoles.add(mappableRoles[i]); + } + } + + return (String[]) portletRoles.toArray(new String[portletRoles.size()]); + } + +} diff --git a/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPoint.java b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPoint.java index dea51beba5..01dd808ec5 100644 --- a/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPoint.java +++ b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPoint.java @@ -16,18 +16,7 @@ package org.springframework.security.ui.portlet; -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.security.AuthenticationException; -import org.springframework.security.ui.AuthenticationEntryPoint; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.core.Ordered; +import org.springframework.security.ui.preauth.PreAuthenticatedProcessingFilterEntryPoint; /** *

In the case of relying on Portlet authentication to access Servlet resources @@ -42,34 +31,6 @@ import org.springframework.core.Ordered; * @since 2.0 * @version $Id$ */ -public class PortletProcessingFilterEntryPoint implements AuthenticationEntryPoint, Ordered { - - //~ Static fields/initializers ===================================================================================== - - private static final Log logger = LogFactory.getLog(PortletProcessingFilterEntryPoint.class); - - //~ Instance fields ================================================================================================ - - private int order = Integer.MAX_VALUE; // ~ default - - //~ Methods ======================================================================================================== - - public int getOrder() { - return order; - } - - public void setOrder(int order) { - this.order = order; - } - - public void commence(ServletRequest request, ServletResponse response, - AuthenticationException authException) throws IOException, ServletException { - - if (logger.isDebugEnabled()) - logger.debug("portlet entry point called. Rejecting access"); - - HttpServletResponse httpResponse = (HttpServletResponse)response; - httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied"); - } +public class PortletProcessingFilterEntryPoint extends PreAuthenticatedProcessingFilterEntryPoint { } diff --git a/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingInterceptor.java b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingInterceptor.java index 3d259ce6a6..624fe60cb1 100644 --- a/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingInterceptor.java +++ b/portlet/src/main/java/org/springframework/security/ui/portlet/PortletProcessingInterceptor.java @@ -35,10 +35,10 @@ import org.springframework.security.AuthenticationException; import org.springframework.security.AuthenticationManager; import org.springframework.security.context.SecurityContext; import org.springframework.security.context.SecurityContextHolder; -import org.springframework.security.providers.portlet.PortletAuthenticationProvider; -import org.springframework.security.providers.portlet.PortletAuthenticationToken; -import org.springframework.security.providers.portlet.populator.ContainerPortletAuthoritiesPopulator; +import org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.security.ui.AbstractProcessingFilter; +import org.springframework.security.ui.AuthenticationDetailsSource; +import org.springframework.security.ui.AuthenticationDetailsSourceImpl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; @@ -81,8 +81,7 @@ import org.springframework.web.portlet.ModelAndView; * @since 2.0 * @version $Id$ */ -public class PortletProcessingInterceptor implements - HandlerInterceptor, InitializingBean { +public class PortletProcessingInterceptor implements HandlerInterceptor, InitializingBean { //~ Static fields/initializers ===================================================================================== @@ -93,6 +92,15 @@ public class PortletProcessingInterceptor implements private AuthenticationManager authenticationManager; private List userNameAttributes; + + private AuthenticationDetailsSource authenticationDetailsSource; + + private boolean useAuthTypeAsCredentials = false; + + public PortletProcessingInterceptor() { + authenticationDetailsSource = new AuthenticationDetailsSourceImpl(); + ((AuthenticationDetailsSourceImpl)authenticationDetailsSource).setClazz(PortletAuthenticationDetails.class); + } //~ Methods ======================================================================================================== @@ -140,13 +148,12 @@ public class PortletProcessingInterceptor implements try { // build the authentication request from the PortletRequest - PortletAuthenticationToken authRequest = new PortletAuthenticationToken( + PreAuthenticatedAuthenticationToken authRequest = new PreAuthenticatedAuthenticationToken( getPrincipalFromRequest(request), - getCredentialsFromRequest(request), - null); + getCredentialsFromRequest(request)); // put the PortletRequest into the authentication request as the "details" - authRequest.setDetails(request); + authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); if (logger.isDebugEnabled()) logger.debug("Beginning authentication request for user '" + authRequest.getName() + "'"); @@ -158,16 +165,18 @@ public class PortletProcessingInterceptor implements Authentication authResult = authenticationManager.authenticate(authRequest); // process a successful authentication - if (logger.isDebugEnabled()) + if (logger.isDebugEnabled()) { logger.debug("Authentication success: " + authResult); + } + ctx.setAuthentication(authResult); onSuccessfulAuthentication(request, response, authResult); } catch (AuthenticationException failed) { - // process an unsuccessful authentication - if (logger.isDebugEnabled()) - logger.debug("Authentication failed - updating ContextHolder to contain null Authentication"); + if (logger.isDebugEnabled()) { + logger.debug("Authentication failed - updating ContextHolder to contain null Authentication", failed); + } ctx.setAuthentication(null); request.getPortletSession().setAttribute( AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY, @@ -251,10 +260,13 @@ public class PortletProcessingInterceptor implements * @return the determined credentials object, or null if none found */ protected Object getCredentialsFromRequest(PortletRequest request) { - return request.getAuthType(); + if (useAuthTypeAsCredentials) { + return request.getAuthType(); + } + + return "dummy"; } - /** * Callback for custom processing prior to the authentication attempt. * @param request the portlet request to be authenticated @@ -286,20 +298,23 @@ public class PortletProcessingInterceptor implements throws IOException {} - public AuthenticationManager getAuthenticationManager() { - return authenticationManager; - } - public void setAuthenticationManager(AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; } - public List getUserNameAttributes() { - return userNameAttributes; - } - public void setUserNameAttributes(List userNameAttributes) { this.userNameAttributes = userNameAttributes; } + public void setAuthenticationDetailsSource(AuthenticationDetailsSource authenticationDetailsSource) { + this.authenticationDetailsSource = authenticationDetailsSource; + } + + /** + * + * @param useAuthTypeAsCredentials + */ + public void setUseAuthTypeAsCredentials(boolean useAuthTypeAsCredentials) { + this.useAuthTypeAsCredentials = useAuthTypeAsCredentials; + } } diff --git a/portlet/src/test/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptorTests.java b/portlet/src/test/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptorTests.java index 76e4eb0de3..9a6619ad94 100644 --- a/portlet/src/test/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptorTests.java +++ b/portlet/src/test/java/org/springframework/security/context/PortletSessionContextIntegrationInterceptorTests.java @@ -22,8 +22,8 @@ import junit.framework.TestCase; import org.springframework.security.GrantedAuthority; import org.springframework.security.GrantedAuthorityImpl; -import org.springframework.security.providers.portlet.PortletAuthenticationToken; import org.springframework.security.providers.portlet.PortletTestUtils; +import org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.security.userdetails.User; import org.springframework.mock.web.portlet.MockActionRequest; import org.springframework.mock.web.portlet.MockActionResponse; @@ -97,8 +97,8 @@ public class PortletSessionContextIntegrationInterceptorTests extends TestCase { public void testNormalRenderRequestProcessing() throws Exception { // Build an Authentication object we simulate came from PortletSession - PortletAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); - PortletAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); // Build a Context to store in PortletSession (simulating prior request) SecurityContext sc = new SecurityContextImpl(); @@ -134,8 +134,8 @@ public class PortletSessionContextIntegrationInterceptorTests extends TestCase { public void testNormalActionRequestProcessing() throws Exception { // Build an Authentication object we simulate came from PortletSession - PortletAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); - PortletAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); // Build a Context to store in PortletSession (simulating prior request) SecurityContext sc = new SecurityContextImpl(); @@ -167,8 +167,8 @@ public class PortletSessionContextIntegrationInterceptorTests extends TestCase { public void testUpdatesCopiedBackIntoSession() throws Exception { // Build an Authentication object we simulate came from PortletSession - PortletAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); - PortletAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); // Build a Context to store in PortletSession (simulating prior request) SecurityContext sc = new SecurityContextImpl(); @@ -226,7 +226,7 @@ public class PortletSessionContextIntegrationInterceptorTests extends TestCase { // Execute the interceptor interceptor.preHandleAction(request, response, null); - PortletAuthenticationToken principal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken principal = PortletTestUtils.createAuthenticatedToken(); SecurityContextHolder.getContext().setAuthentication(principal); interceptor.afterActionCompletion(request, response, null, null); @@ -289,7 +289,7 @@ public class PortletSessionContextIntegrationInterceptorTests extends TestCase { // Execute the interceptor interceptor.preHandleAction(request, response, null); - PortletAuthenticationToken principal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken principal = PortletTestUtils.createAuthenticatedToken(); SecurityContextHolder.getContext().setAuthentication(principal); interceptor.afterActionCompletion(request, response, null, null); @@ -312,7 +312,7 @@ public class PortletSessionContextIntegrationInterceptorTests extends TestCase { // Execute the interceptor interceptor.preHandleAction(request, response, null); - PortletAuthenticationToken principal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken principal = PortletTestUtils.createAuthenticatedToken(); SecurityContextHolder.getContext().setAuthentication(principal); interceptor.afterActionCompletion(request, response, null, null); @@ -323,8 +323,8 @@ public class PortletSessionContextIntegrationInterceptorTests extends TestCase { public void testUsePortletScopeSession() throws Exception { // Build an Authentication object we simulate came from PortletSession - PortletAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); - PortletAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken sessionPrincipal = PortletTestUtils.createAuthenticatedToken(); + PreAuthenticatedAuthenticationToken baselinePrincipal = PortletTestUtils.createAuthenticatedToken(); // Build a Context to store in PortletSession (simulating prior request) SecurityContext sc = new SecurityContextImpl(); diff --git a/portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationProviderTests.java b/portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationProviderTests.java deleted file mode 100644 index bf375998c9..0000000000 --- a/portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationProviderTests.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet; - -import junit.framework.TestCase; - -import org.springframework.security.Authentication; -import org.springframework.security.AuthenticationException; -import org.springframework.security.BadCredentialsException; -import org.springframework.security.providers.UsernamePasswordAuthenticationToken; -import org.springframework.security.userdetails.UserDetails; - -/** - * Tests {@link PortletAuthenticationProvider} - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class PortletAuthenticationProviderTests extends TestCase { - - //~ Constructors =================================================================================================== - - public PortletAuthenticationProviderTests() { - super(); - } - - public PortletAuthenticationProviderTests(String arg0) { - super(arg0); - } - - //~ Methods ======================================================================================================== - - public void testRequiresPopulator() throws Exception { - PortletAuthenticationProvider provider = new PortletAuthenticationProvider(); - try { - provider.afterPropertiesSet(); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException failed) { - //ignored - } - } - - public void testNormalOperation() throws Exception { - PortletAuthenticationProvider provider = new PortletAuthenticationProvider(); - provider.setPortletAuthoritiesPopulator(new MockAuthoritiesPopulator(false)); - provider.afterPropertiesSet(); - Authentication result = provider.authenticate(PortletTestUtils.createToken()); - assertNotNull(result); - assertNotNull(result.getAuthorities()); - } - - public void testAuthenticationIsNullWithUnsupportedToken() { - PortletAuthenticationProvider provider = new PortletAuthenticationProvider(); - Authentication request = new UsernamePasswordAuthenticationToken(PortletTestUtils.TESTUSER, PortletTestUtils.TESTCRED); - Authentication result = provider.authenticate(request); - assertNull(result); - } - - public void testFailsWithNoCredentials() { - PortletAuthenticationProvider provider = new PortletAuthenticationProvider(); - provider.setPortletAuthoritiesPopulator(new MockAuthoritiesPopulator(false)); - try { - provider.authenticate(new PortletAuthenticationToken(PortletTestUtils.TESTUSER, null, null)); - fail("Should have thrown BadCredentialsException"); - } catch (BadCredentialsException e) { - //ignore - } - } - - public void testPopulatorRejectionCausesFailure() throws Exception { - PortletAuthenticationProvider provider = new PortletAuthenticationProvider(); - provider.setPortletAuthoritiesPopulator(new MockAuthoritiesPopulator(true)); - try { - provider.authenticate(PortletTestUtils.createToken()); - fail("Should have thrown BadCredentialsException"); - } catch (BadCredentialsException e) { - //ignore - } - } - - //~ Inner Classes ================================================================================================== - - public static class MockAuthoritiesPopulator implements PortletAuthoritiesPopulator { - - private boolean reject = false; - - public MockAuthoritiesPopulator (boolean reject) { - this.reject = reject; - } - - public UserDetails getUserDetails(Authentication authentication) - throws AuthenticationException { - if (authentication.getCredentials() == null) - throw new BadCredentialsException("Invalid Credentials"); - if (reject) - throw new BadCredentialsException("Authentication Rejected"); - return PortletTestUtils.createUser(); - } - - } - -} diff --git a/portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationTokenTests.java b/portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationTokenTests.java deleted file mode 100644 index 3f1b62dd39..0000000000 --- a/portlet/src/test/java/org/springframework/security/providers/portlet/PortletAuthenticationTokenTests.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet; - -import junit.framework.TestCase; - -/** - * Tests for {@link PortletAuthenticationToken}. - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class PortletAuthenticationTokenTests extends TestCase { - - //~ Constructors =================================================================================================== - - public PortletAuthenticationTokenTests() {} - - public PortletAuthenticationTokenTests(String s) { - super(s); - } - - //~ Methods ======================================================================================================== - - public void setUp() throws Exception { - super.setUp(); - } - - public void testPrincipal() throws Exception { - PortletAuthenticationToken token = PortletTestUtils.createToken(); - assertEquals(PortletTestUtils.TESTUSER, token.getPrincipal()); - } - - public void testCredentials() throws Exception { - PortletAuthenticationToken token = PortletTestUtils.createToken(); - assertEquals(PortletTestUtils.TESTCRED, token.getCredentials()); - } - - public void testAuthenticated() throws Exception { - PortletAuthenticationToken token = PortletTestUtils.createToken(); - assertTrue(!token.isAuthenticated()); - token.setAuthenticated(true); - assertTrue(token.isAuthenticated()); - token.setAuthenticated(false); - assertTrue(!token.isAuthenticated()); - } - -} diff --git a/portlet/src/test/java/org/springframework/security/providers/portlet/PortletTestUtils.java b/portlet/src/test/java/org/springframework/security/providers/portlet/PortletTestUtils.java index 2477945dc0..11e1078d38 100644 --- a/portlet/src/test/java/org/springframework/security/providers/portlet/PortletTestUtils.java +++ b/portlet/src/test/java/org/springframework/security/providers/portlet/PortletTestUtils.java @@ -24,6 +24,8 @@ import org.springframework.security.context.SecurityContext; import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.context.SecurityContextImpl; import org.springframework.security.providers.TestingAuthenticationToken; +import org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationToken; +import org.springframework.security.ui.portlet.PortletAuthenticationDetails; import org.springframework.security.userdetails.User; import org.springframework.security.userdetails.UserDetails; import org.springframework.mock.web.portlet.MockActionRequest; @@ -88,41 +90,25 @@ public class PortletTestUtils { return response; } - public static PortletAuthenticationToken createToken(PortletRequest request) { - PortletAuthenticationToken token = new PortletAuthenticationToken(TESTUSER, TESTCRED, null); - token.setDetails(request); + public static PreAuthenticatedAuthenticationToken createToken(PortletRequest request) { + PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken(TESTUSER, TESTCRED); + token.setDetails(new PortletAuthenticationDetails(request)); return token; } - public static PortletAuthenticationToken createToken() { + public static PreAuthenticatedAuthenticationToken createToken() { MockRenderRequest request = createRenderRequest(); return createToken(request); } - public static PortletAuthenticationToken createAuthenticatedToken(UserDetails user) { - PortletAuthenticationToken result = new PortletAuthenticationToken( + public static PreAuthenticatedAuthenticationToken createAuthenticatedToken(UserDetails user) { + PreAuthenticatedAuthenticationToken result = new PreAuthenticatedAuthenticationToken( user, user.getPassword(), user.getAuthorities()); result.setAuthenticated(true); return result; } - public static PortletAuthenticationToken createAuthenticatedToken() { + public static PreAuthenticatedAuthenticationToken createAuthenticatedToken() { return createAuthenticatedToken(createUser()); } - public static void setupSecurityContext(PortletRequest request) { - PortletAuthenticationToken token = createToken(request); - SecurityContext context = new SecurityContextImpl(); - context.setAuthentication(token); - SecurityContextHolder.setContext(context); - } - - public static void setupSecurityContext() { - MockRenderRequest request = createRenderRequest(); - setupSecurityContext(request); - } - - public static void cleanupSecurityContext() { - SecurityContextHolder.clearContext(); - } - } diff --git a/portlet/src/test/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulatorTests.java b/portlet/src/test/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulatorTests.java deleted file mode 100644 index 7e9f9cde1b..0000000000 --- a/portlet/src/test/java/org/springframework/security/providers/portlet/populator/ContainerPortletAuthoritiesPopulatorTests.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet.populator; - -import java.util.ArrayList; -import java.util.List; - -import junit.framework.TestCase; - -import org.springframework.security.AuthenticationServiceException; -import org.springframework.security.GrantedAuthorityImpl; -import org.springframework.security.providers.portlet.PortletAuthenticationToken; -import org.springframework.security.providers.portlet.PortletTestUtils; -import org.springframework.security.userdetails.UserDetails; - - -/** - * Tests for {@link ContainerPortletAuthoritiesPopulator} - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class ContainerPortletAuthoritiesPopulatorTests extends TestCase { - - //~ Constructors =================================================================================================== - - public ContainerPortletAuthoritiesPopulatorTests() { - super(); - } - - public ContainerPortletAuthoritiesPopulatorTests(String arg0) { - super(arg0); - } - - //~ Methods ======================================================================================================== - - public final void setUp() throws Exception { - super.setUp(); - } - - private List createRolesToCheck() { - ArrayList rolesToCheck = new ArrayList(); - rolesToCheck.add(PortletTestUtils.PORTALROLE1); - rolesToCheck.add("BOGUS1"); - rolesToCheck.add(PortletTestUtils.PORTALROLE2); - rolesToCheck.add("BOGUS2"); - return rolesToCheck; - } - - public void testGetGrantedAuthorities() throws Exception { - ContainerPortletAuthoritiesPopulator populator = new ContainerPortletAuthoritiesPopulator(); - UserDetails results = populator.getUserDetails(PortletTestUtils.createToken()); - assertEquals(1, results.getAuthorities().length); - assertEquals(new GrantedAuthorityImpl(ContainerPortletAuthoritiesPopulator.DEFAULT_USER_ROLE), results.getAuthorities()[0]); - } - - public void testGetGrantedAuthoritiesCheckRoles() throws Exception { - ContainerPortletAuthoritiesPopulator populator = new ContainerPortletAuthoritiesPopulator(); - populator.setRolesToCheck(createRolesToCheck()); - UserDetails results = populator.getUserDetails(PortletTestUtils.createToken()); - assertEquals(3, results.getAuthorities().length); - assertEquals(new GrantedAuthorityImpl(ContainerPortletAuthoritiesPopulator.DEFAULT_USER_ROLE), results.getAuthorities()[2]); - assertEquals(new GrantedAuthorityImpl(PortletTestUtils.TESTROLE1), results.getAuthorities()[0]); - assertEquals(new GrantedAuthorityImpl(PortletTestUtils.TESTROLE2), results.getAuthorities()[1]); - } - - public void testGetGrantedAuthoritiesCustomPrefix() throws Exception { - String prefix = "IHAVE_"; - ContainerPortletAuthoritiesPopulator populator = new ContainerPortletAuthoritiesPopulator(); - populator.setRolesToCheck(createRolesToCheck()); - populator.setRolePrefix(prefix); - UserDetails results = populator.getUserDetails(PortletTestUtils.createToken()); - assertEquals(3, results.getAuthorities().length); - assertEquals(new GrantedAuthorityImpl(ContainerPortletAuthoritiesPopulator.DEFAULT_USER_ROLE), results.getAuthorities()[2]); - assertEquals(new GrantedAuthorityImpl(prefix + PortletTestUtils.PORTALROLE1), results.getAuthorities()[0]); - assertEquals(new GrantedAuthorityImpl(prefix + PortletTestUtils.PORTALROLE2), results.getAuthorities()[1]); - } - - public void testGetGrantedAuthoritiesNullDefault() throws Exception { - ContainerPortletAuthoritiesPopulator populator = new ContainerPortletAuthoritiesPopulator(); - populator.setUserRole(null); - UserDetails results = populator.getUserDetails(PortletTestUtils.createToken()); - assertEquals(0, results.getAuthorities().length); - } - - public void testGetGrantedAuthoritiesEmptyDefault() throws Exception { - ContainerPortletAuthoritiesPopulator populator = new ContainerPortletAuthoritiesPopulator(); - populator.setUserRole(""); - UserDetails results = populator.getUserDetails(PortletTestUtils.createToken()); - assertEquals(0, results.getAuthorities().length); - } - - public void testGetGrantedAuthoritiesForInvalidToken() throws Exception { - ContainerPortletAuthoritiesPopulator populator = new ContainerPortletAuthoritiesPopulator(); - PortletAuthenticationToken token = PortletTestUtils.createToken(); - token.setDetails(null); - try { - populator.getUserDetails(token); - fail("Should have thrown AuthenticationServiceException"); - } catch (AuthenticationServiceException e) { - // ignore - } - token.setDetails("bogus"); - try { - populator.getUserDetails(token); - fail("Should have thrown AuthenticationServiceException"); - } catch (AuthenticationServiceException e) { - // ignore - } - } - -} diff --git a/portlet/src/test/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulatorTests.java b/portlet/src/test/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulatorTests.java deleted file mode 100644 index 0c4622729a..0000000000 --- a/portlet/src/test/java/org/springframework/security/providers/portlet/populator/DaoPortletAuthoritiesPopulatorTests.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.providers.portlet.populator; - -import junit.framework.TestCase; - -import org.springframework.security.GrantedAuthorityImpl; -import org.springframework.security.providers.portlet.PortletAuthenticationToken; -import org.springframework.security.providers.portlet.PortletTestUtils; -import org.springframework.security.userdetails.UserDetails; -import org.springframework.security.userdetails.UserDetailsService; -import org.springframework.security.userdetails.UsernameNotFoundException; -import org.springframework.dao.DataAccessException; - - -/** - * Tests for {@link DaoPortletAuthoritiesPopulator} - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class DaoPortletAuthoritiesPopulatorTests extends TestCase { - - //~ Constructors =================================================================================================== - - public DaoPortletAuthoritiesPopulatorTests() { - super(); - } - - public DaoPortletAuthoritiesPopulatorTests(String arg0) { - super(arg0); - } - - //~ Methods ======================================================================================================== - - public final void setUp() throws Exception { - super.setUp(); - } - - public void testRequiresDao() throws Exception { - DaoPortletAuthoritiesPopulator populator = new DaoPortletAuthoritiesPopulator(); - try { - populator.afterPropertiesSet(); - fail("Should have thrown IllegalArgumentException"); - } catch (IllegalArgumentException failed) { - // ignored - } - } - - public void testGetGrantedAuthoritiesForValidUser() throws Exception { - DaoPortletAuthoritiesPopulator populator = new DaoPortletAuthoritiesPopulator(); - populator.setUserDetailsService(new MockAuthenticationDao()); - populator.afterPropertiesSet(); - UserDetails results = populator.getUserDetails(PortletTestUtils.createToken()); - assertEquals(2, results.getAuthorities().length); - assertEquals(new GrantedAuthorityImpl(PortletTestUtils.TESTROLE1), results.getAuthorities()[0]); - assertEquals(new GrantedAuthorityImpl(PortletTestUtils.TESTROLE2), results.getAuthorities()[1]); - } - - public void testGetGrantedAuthoritiesForInvalidUser() throws Exception { - DaoPortletAuthoritiesPopulator populator = new DaoPortletAuthoritiesPopulator(); - populator.setUserDetailsService(new MockAuthenticationDao()); - populator.afterPropertiesSet(); - try { - populator.getUserDetails(new PortletAuthenticationToken("dummy", "dummy", null)); - fail("Should have thrown UsernameNotFoundException"); - } catch (UsernameNotFoundException e) { - // ignore - } - } - - //~ Inner Classes ================================================================================================== - - private class MockAuthenticationDao implements UserDetailsService { - - public UserDetails loadUserByUsername(String username) - throws UsernameNotFoundException, DataAccessException { - if (PortletTestUtils.TESTUSER.equals(username)) - return PortletTestUtils.createUser(); - throw new UsernameNotFoundException("Could not find: " + username); - } - - } - -} diff --git a/portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPointTests.java b/portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPointTests.java deleted file mode 100644 index 7eb5d75180..0000000000 --- a/portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingFilterEntryPointTests.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2005-2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.security.ui.portlet; - -import javax.servlet.http.HttpServletResponse; - -import junit.framework.TestCase; - -import org.springframework.security.BadCredentialsException; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; - -/** - * Tests {@link PortletProcessingFilterEntryPoint}. - * - * @author John A. Lewis - * @since 2.0 - * @version $Id$ - */ -public class PortletProcessingFilterEntryPointTests extends TestCase { - - //~ Constructors =================================================================================================== - - public PortletProcessingFilterEntryPointTests() { - super(); - } - - public PortletProcessingFilterEntryPointTests(String arg0) { - super(arg0); - } - - //~ Methods ======================================================================================================== - - public final void setUp() throws Exception { - super.setUp(); - } - - public void testNormalOperation() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - MockHttpServletResponse response = new MockHttpServletResponse(); - PortletProcessingFilterEntryPoint entryPoint = new PortletProcessingFilterEntryPoint(); - entryPoint.commence(request, response, new BadCredentialsException(null)); - assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); - } - -} diff --git a/portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingInterceptorTests.java b/portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingInterceptorTests.java index 2b5143f1b4..ce6fc77a54 100644 --- a/portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingInterceptorTests.java +++ b/portlet/src/test/java/org/springframework/security/ui/portlet/PortletProcessingInterceptorTests.java @@ -32,8 +32,8 @@ import org.springframework.security.GrantedAuthorityImpl; import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.providers.TestingAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken; -import org.springframework.security.providers.portlet.PortletAuthenticationToken; import org.springframework.security.providers.portlet.PortletTestUtils; +import org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.security.ui.AbstractProcessingFilter; import org.springframework.security.userdetails.User; import org.springframework.mock.web.portlet.MockActionRequest; @@ -74,6 +74,7 @@ public class PortletProcessingInterceptorTests extends TestCase { public void testRequiresAuthenticationManager() throws Exception { PortletProcessingInterceptor interceptor = new PortletProcessingInterceptor(); + try { interceptor.afterPropertiesSet(); fail("Expected IllegalArgumentException"); @@ -251,14 +252,14 @@ public class PortletProcessingInterceptorTests extends TestCase { public Authentication authenticate(Authentication token) { // Make sure we got a valid token - if (!(token instanceof PortletAuthenticationToken)) { - TestCase.fail("Expected PortletAuthentication object-- got: " + token); + if (!(token instanceof PreAuthenticatedAuthenticationToken)) { + TestCase.fail("Expected PreAuthenticatedAuthenticationToken object-- got: " + token); } // Make sure the token details are the PortletRequest - if (!(token.getDetails() instanceof PortletRequest)) { - TestCase.fail("Expected Authentication.getDetails to be a PortletRequest object -- got: " + token.getDetails()); - } +// if (!(token.getDetails() instanceof PortletRequest)) { +// TestCase.fail("Expected Authentication.getDetails to be a PortletRequest object -- got: " + token.getDetails()); +// } // Make sure it's got a principal if (token.getPrincipal() == null) { @@ -273,7 +274,7 @@ public class PortletProcessingInterceptorTests extends TestCase { // create resulting Authentication object User user = new User(token.getName(), token.getCredentials().toString(), true, true, true, true, new GrantedAuthority[] {new GrantedAuthorityImpl(PortletTestUtils.TESTROLE1), new GrantedAuthorityImpl(PortletTestUtils.TESTROLE2)}); - PortletAuthenticationToken result = new PortletAuthenticationToken( + PreAuthenticatedAuthenticationToken result = new PreAuthenticatedAuthenticationToken( user, user.getPassword(), user.getAuthorities()); result.setAuthenticated(true); return result;