View Javadoc

1   /* Copyright 2004, 2005 Acegi Technology Pty Limited
2    *
3    * Licensed under the Apache License, Version 2.0 (the "License");
4    * you may not use this file except in compliance with the License.
5    * You may obtain a copy of the License at
6    *
7    *     http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  package org.acegisecurity.runas;
17  
18  import org.acegisecurity.AcegiMessageSource;
19  import org.acegisecurity.Authentication;
20  import org.acegisecurity.AuthenticationException;
21  import org.acegisecurity.BadCredentialsException;
22  import org.acegisecurity.providers.AuthenticationProvider;
23  import org.springframework.beans.factory.InitializingBean;
24  import org.springframework.context.MessageSource;
25  import org.springframework.context.MessageSourceAware;
26  import org.springframework.context.support.MessageSourceAccessor;
27  import org.springframework.util.Assert;
28  
29  
30  /***
31   * An {@link AuthenticationProvider} implementation that can authenticate a
32   * {@link RunAsUserToken}.
33   * 
34   * <P>
35   * Configured in the bean context with a key that should match the key used by
36   * adapters to generate the <code>RunAsUserToken</code>. It treats as valid
37   * any <code>RunAsUserToken</code> instance presenting a hash code that
38   * matches the <code>RunAsImplAuthenticationProvider</code>-configured key.
39   * </p>
40   * 
41   * <P>
42   * If the key does not match, a <code>BadCredentialsException</code> is thrown.
43   * </p>
44   */
45  public class RunAsImplAuthenticationProvider implements InitializingBean,
46      AuthenticationProvider, MessageSourceAware {
47      //~ Instance fields ========================================================
48  
49      protected MessageSourceAccessor messages = AcegiMessageSource.getAccessor();
50      private String key;
51  
52      //~ Methods ================================================================
53  
54      public void afterPropertiesSet() throws Exception {
55          Assert.notNull(key,
56              "A Key is required and should match that configured for the RunAsManagerImpl");
57      }
58  
59      public Authentication authenticate(Authentication authentication)
60          throws AuthenticationException {
61          RunAsUserToken token = (RunAsUserToken) authentication;
62  
63          if (token.getKeyHash() == key.hashCode()) {
64              return authentication;
65          } else {
66              throw new BadCredentialsException(messages.getMessage(
67                      "RunAsImplAuthenticationProvider.incorrectKey",
68                      "The presented RunAsUserToken does not contain the expected key"));
69          }
70      }
71  
72      public String getKey() {
73          return key;
74      }
75  
76      public void setKey(String key) {
77          this.key = key;
78      }
79  
80      public void setMessageSource(MessageSource messageSource) {
81          this.messages = new MessageSourceAccessor(messageSource);
82      }
83  
84      public boolean supports(Class authentication) {
85          if (RunAsUserToken.class.isAssignableFrom(authentication)) {
86              return true;
87          } else {
88              return false;
89          }
90      }
91  }