2016-05-25 14 views
0

Hallo ich diese Klasse erstellt haben alle Federsicherheits Ausnahme zu behandeln:Griff Spring Security Exception CXF

   import org.apache.cxf.binding.soap.SoapFault; 
       import org.apache.cxf.binding.soap.SoapMessage; 
       import org.apache.cxf.interceptor.Fault; 
       import org.apache.cxf.phase.AbstractPhaseInterceptor; 
       import org.apache.cxf.phase.Phase; 
       import org.springframework.beans.factory.InitializingBean; 
       import org.springframework.security.authentication.AuthenticationManager; 
       import org.springframework.security.core.Authentication; 
       import org.springframework.security.core.AuthenticationException; 

       /** 
       * The Class SoapAuthenticationInterceptor. 
       */ 
       public class SoapAuthenticationInterceptor extends AbstractPhaseInterceptor<SoapMessage> implements InitializingBean { 

        /** The authentication manager. */ 
        private AuthenticationManager authenticationManager; 

        /** The authentication required. */ 
        private boolean authenticationRequired = true; 

        /** 
        * Instantiates a new soap authentication interceptor. 
        */ 
        public SoapAuthenticationInterceptor() { 
         super(Phase.RECEIVE); 
        } 

        /** 
        * Sets the authentication manager. 
        * 
        * @param authenticationManager 
        *   the new authentication manager 
        */ 
        public void setAuthenticationManager(AuthenticationManager authenticationManager) { 
         this.authenticationManager = authenticationManager; 
        } 

        /** 
        * Sets the authentication required. 
        * 
        * @param authenticationRequired 
        *   the new authentication required 
        */ 
        public void setAuthenticationRequired(boolean authenticationRequired) { 
         this.authenticationRequired = authenticationRequired; 
        } 

        /* 
        * (non-Javadoc) 
        * 
        * @see 
        * org.springframework.beans.factory.InitializingBean#afterPropertiesSet() 
        */ 
        public void afterPropertiesSet() throws Exception { 
         if (authenticationManager == null) { 
          throw new IllegalStateException("No authentication manager has been configured"); 
         } 
        } 

        /* 
        * (non-Javadoc) 
        * 
        * @see org.apache.cxf.interceptor.Interceptor#handleMessage(org.apache.cxf. 
        * message.Message) 
        */ 
        public void handleMessage(SoapMessage message) throws Fault { 
         Authentication authentication = message.getExchange().get(Authentication.class); 
         if (authentication != null) { 
          try { 
           authentication = authenticationManager.authenticate(authentication); 
           message.getExchange().put(Authentication.class, authentication); 
          } catch (AuthenticationException ex) { 
           throw new SoapFault("Bad credentials", message.getVersion().getSender()); 
          } 
         } else if (authenticationRequired) { 
          throw new SoapFault("Authentication required", message.getVersion().getSender()); 
         } 
        } 
       } 

dann in meinem applicationContext.xml ich dieses intercepter wie diese konfiguriert haben:

  <bean id="soapAuthenticationInterceptor" class="com.test.cxf.interceptors.SoapAuthenticationInterceptor"> 
       <property name="authenticationManager" ref="authenticationManager" /> 
      </bean> 

      <cxf:bus> 
       <cxf:features> 
        <cxf:logging /> 
       </cxf:features> 
       <cxf:inInterceptors> 
        <ref bean="soapAuthenticationInterceptor" /> 
       </cxf:inInterceptors> 
       <cxf:outFaultInterceptors> 
        <ref bean="soapAuthenticationInterceptor" /> 
       </cxf:outFaultInterceptors> 
      </cxf:bus> 

mein Problem ist, wenn ich einen Soapui-Umschlag mit einem schlechten Login/Passwort sende, wird der Interceptor nicht aufgerufen?

können Sie mir bitte helfen?

+0

ist außer Kraft zu setzen haben Sie die Klasse AuthenticationManager definiert, die Sie ‚ref'erring zu? – Sampada

+0

ja der Code funktioniert gut und keine Ausnahme –

+0

ok. Du hast gesagt, dass der Interceptor nicht aufgerufen wird, wenn du ein schlechtes login/pwd sendest. Wird es sonst aufgerufen? – Sampada

Antwort

0

Sie müssen eine benutzerdefinierte CallbackHandler erstellen und ihre handle Methode implementieren. Rufen Sie in Ihrer authenticationManager Klasse diese Methode auf und übergeben Sie den Benutzernamen und das Kennwort.

Weitere Details finden Sie hier: http://cxf.apache.org/docs/ws-security.html

+0

Ich kann CallbackHandler verwenden, weil ich Spring Security nicht ws-Sicherheit verwenden –

+0

Check Abschnitt 7.2 hier: http://docs.spring.io/spring-ws/site/reference/html/security.html – Sampada