2014-09-19 80 views
1

我已经使用wss4j SimplePasswordValidationCallbackHandler创建并验证了示例web服务。使用wss4j验证选择性弹簧web服务器SimplePasswordValidationCallbackHandler

端点类:

@Endpoint                    
public class HolidayEndpoint { 

    private static final String NAMESPACE_URI = "http://mycompany.com/hr/schemas"; 

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "HolidayRequest") 
    public HolidayResponse handleHolidayRequest(HolidayRequest holidayRequest)    
     throws Exception { 
     HolidayResponse result = new HolidayResponse(); 
    result.setResult(1); 
    return result; 
    } 
} 

配置:

<bean 
     class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"> 
     <property name="interceptors"> 
      <list> 
       <ref local="wsServerSecurityInterceptor" /> 
      </list> 
     </property> 
    </bean> 

    <bean id="wsServerSecurityInterceptor" 
     class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor"> 
     <property name="validationActions" value="UsernameToken" /> 
     <property name="validationCallbackHandler"> 
      <bean id="callbackHandler" 
       class="org.springframework.ws.soap.security.wss4j.callback.SimplePasswordValidationCallbackHandler"> 
       <property name="users"> 
        <props> 
         <prop key="Bert">Ernie</prop> 
        </props> 
       </property> 
      </bean> 
     </property> 
    </bean> 

服务和认证,因此是工作的罚款。

现在我想添加另一个没有此身份验证的Spring Web服务。 这里的问题是我没有定义任何可以应用身份验证的服务集。因此,对于我创建的每个新的Spring Web服务,都会应用相同的身份验证规则。

任何人都可以请建议我如何才能使此认证仅适用于一组选定的服务,并将一些不同的认证规则应用于不同的服务组。

回答

0

诀窍是为您的安全拦截器使用一个SmartEndpointInterceptor包装。智能拦截器可以决定是否拦截给定的消息。配置它最简单的方法是在你配置一个<sws:interceptors>块:

<sws:annotation-driven/> <!-- Instead of the PayloadRootAnnotationMethodEndpointMapping bean definition --> 

    <sws:interceptors> 
     <sws:payloadRoot namespaceUri="http://mycompany.com/hr/schemas" localPart="HolidayRequest"> 
      <ref bean="wsServerSecurityInterceptor"/> 
     </sws:payloadRoot> 
    </sws:interceptors> 

    <bean id="wsServerSecurityInterceptor" 
     class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor"> 
     <property name="validationActions" value="UsernameToken" /> 
     <property name="validationCallbackHandler"> 
      <bean id="callbackHandler" 
       class="org.springframework.ws.soap.security.wss4j.callback.SimplePasswordValidationCallbackHandler"> 
       <property name="users"> 
        <props> 
         <prop key="Bert">Ernie</prop> 
        </props> 
       </property> 
      </bean> 
     </property> 
    </bean> 

在这个例子中,安全拦截器将只适用于与http://mycompany.com/hr/schemas命名空间和HolidayRequest本地名称的消息。