使用wss4j验证选择性弹簧web服务器SimplePasswordValidationCallbackHandler
问题描述:
我已经使用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服务,都会应用相同的身份验证规则。
任何人都可以请建议我如何才能使此认证仅适用于一组选定的服务,并将一些不同的认证规则应用于不同的服务组。
答
诀窍是为您的安全拦截器使用一个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
本地名称的消息。