001: /* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
002: *
003: * Licensed under the Apache License, Version 2.0 (the "License");
004: * you may not use this file except in compliance with the License.
005: * You may obtain a copy of the License at
006: *
007: * http://www.apache.org/licenses/LICENSE-2.0
008: *
009: * Unless required by applicable law or agreed to in writing, software
010: * distributed under the License is distributed on an "AS IS" BASIS,
011: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: * See the License for the specific language governing permissions and
013: * limitations under the License.
014: */
015: package org.acegisecurity.providers.openid;
016:
017: import org.acegisecurity.Authentication;
018: import org.acegisecurity.AuthenticationException;
019: import org.acegisecurity.AuthenticationServiceException;
020: import org.acegisecurity.BadCredentialsException;
021:
022: import org.acegisecurity.providers.AuthenticationProvider;
023: import org.acegisecurity.providers.cas.CasAuthoritiesPopulator;
024:
025: import org.acegisecurity.userdetails.UserDetails;
026:
027: import org.springframework.beans.factory.InitializingBean;
028:
029: import org.springframework.util.Assert;
030:
031: /**
032: * Finalises the OpenID authentication by obtaining local roles
033: *
034: * @author Robin Bramley, Opsera Ltd.
035: */
036: public class OpenIDAuthenticationProvider implements
037: AuthenticationProvider, InitializingBean {
038: //~ Instance fields ================================================================================================
039:
040: private CasAuthoritiesPopulator ssoAuthoritiesPopulator;
041:
042: //~ Methods ========================================================================================================
043:
044: public void afterPropertiesSet() throws Exception {
045: Assert.notNull(this .ssoAuthoritiesPopulator,
046: "The ssoAuthoritiesPopulator must be set");
047: }
048:
049: /* (non-Javadoc)
050: * @see org.acegisecurity.providers.AuthenticationProvider#authenticate(org.acegisecurity.Authentication)
051: */
052: public Authentication authenticate(Authentication authentication)
053: throws AuthenticationException {
054:
055: if (!supports(authentication.getClass())) {
056: return null;
057: }
058:
059: if (authentication instanceof OpenIDAuthenticationToken) {
060: OpenIDAuthenticationToken response = (OpenIDAuthenticationToken) authentication;
061: OpenIDAuthenticationStatus status = response.getStatus();
062:
063: // handle the various possibilites
064: if (status == OpenIDAuthenticationStatus.SUCCESS) {
065: //String message = "Log in succeeded: ";// + savedId;
066:
067: /* TODO: allow for regex for mapping URL
068: * e.g. http://mydomain.com/username
069: * or http://{username}.mydomain.com
070: */
071:
072: // Lookup user details
073: UserDetails userDetails = this .ssoAuthoritiesPopulator
074: .getUserDetails(response.getIdentityUrl());
075:
076: authentication = new OpenIDAuthenticationToken(
077: userDetails.getAuthorities(), response
078: .getStatus(), response.getIdentityUrl());
079:
080: return authentication;
081: } else if (status == OpenIDAuthenticationStatus.CANCELLED) {
082: throw new AuthenticationCancelledException(
083: "Log in cancelled");
084: } else if (status == OpenIDAuthenticationStatus.ERROR) {
085: throw new AuthenticationServiceException(
086: "Error message from server: "
087: + response.getMessage());
088: } else if (status == OpenIDAuthenticationStatus.FAILURE) {
089: throw new BadCredentialsException(
090: "Log in failed - identity could not be verified");
091: } else if (status == OpenIDAuthenticationStatus.SETUP_NEEDED) {
092: throw new AuthenticationServiceException(
093: "The server responded setup was needed, which shouldn't happen");
094: } else {
095: throw new AuthenticationServiceException(
096: "Unrecognized return value "
097: + status.toString());
098: }
099: }
100:
101: return null;
102: }
103:
104: public void setSsoAuthoritiesPopulator(
105: CasAuthoritiesPopulator ssoAuthoritiesPopulator) {
106: this .ssoAuthoritiesPopulator = ssoAuthoritiesPopulator;
107: }
108:
109: /* (non-Javadoc)
110: * @see org.acegisecurity.providers.AuthenticationProvider#supports(java.lang.Class)
111: */
112: public boolean supports(Class authentication) {
113: return OpenIDAuthenticationToken.class
114: .isAssignableFrom(authentication);
115: }
116: }
|