2016-05-25 3 views
0

Привет я создал этот класс, чтобы обрабатывать все исключения весной безопасности:Handle Exception Spring Security 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()); 
         } 
        } 
       } 

то в моем applicationContext.xml я настроил этот Intercepter так:

  <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> 

мой Проблема в том, когда я отправляю конверт soapui с неправильным логином/паролем, который не вызывается Interceptor?

Вы можете помочь мне?

+0

вы определили класс AuthenticationManager, что вы «ref'erring к? – Sampada

+0

да код работает нормально и без исключения –

+0

ok. вы сказали, что перехватчик не вызывается, когда вы отправляете плохой логин/pwd. Вызывается ли это иначе? – Sampada

ответ

0

Вам необходимо создать обычай CallbackHandler и реализовать его метод handle. В своем классе authenticationManager вызовите этот метод и передайте ему имя пользователя и пароль.

Более подробную информацию можно найти здесь: http://cxf.apache.org/docs/ws-security.html

+0

Я могу использовать CallbackHandler, потому что я использую весеннюю безопасность, а не ws-security. –

+0

. Проверьте раздел 7.2 здесь: http://docs.spring.io/spring-ws/site/reference/html/security.html – Sampada