Как улучшить метод перехвата обработчика обратного вызова CXF
Я сделал WSS4JInInterceptor в файле конфигурации Spring Bean следующим образом
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd">
<jaxws:endpoint id="book"
implementor="net.ma.soap.ws.endpoints.IBookEndPointImpl" address="/bookAuth">
<jaxws:inInterceptors>
<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor"></bean>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackClass" value="net.ma.soap.ws.service.ServerPasswordCallback"></entry>
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
</jaxws:endpoint>
</beans>
ServerPasswordCallBack.java выглядит следующим образом
package net.ma.soap.ws.service;
import java.io.IOException;
import java.util.ResourceBundle;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.wss4j.common.ext.WSPasswordCallback;
public class ServerPasswordCallback implements CallbackHandler {
private static final String BUNDLE_LOCATION = "zuth";
private static final String PASSWORD_PROPERTY_NAME = "auth.manager.password";
private static String password;
static {
final ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_LOCATION);
password = bundle.getString(PASSWORD_PROPERTY_NAME);
}
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword(password);
}
}
С проверкой пароля все работает просто отлично.
Я хотел бы знать, есть ли какой-либо другой способ усовершенствовать метод handle(Callback), чтобы сделать его более сложным, чтобы он мог проверять более одного параметра, например, если я могу заставить его проверять токен доступа, он было бы намного лучше.
свойство пароля определяется в файле zuth_fr_FR.properties следующим образом
auth.manager.password= Najah
1 ответ
Если вы хотите выполнить некоторую пользовательскую проверку вашего имени пользователя и токена (например, выполнить проверку по службе каталогов с использованием LDAP или чего-то подобного), вы можете написать свой собственный переопределение UsernameTokenValidator. verifyPlaintextPassword(UsernameToken usernameToken)
UsernameTokenValidator и подключите его к вашему WSS4JInInterceptor, добавив следующее в определение вашего бина
<property name="wssConfig">
<ref bean="usernameTokenWssConfig"/>
</property>
И добавьте ссылочный класс в вашу кодовую базу:
@Component("usernameTokenWssConfig")
public class usernameTokenWssConfigWSSConfig {
public usernameTokenWssConfig() {
setValidator(WSSecurityEngine.USERNAME_TOKEN, new CustomUsernameTokenValidator());
setRequiredPasswordType(WSConstants.PASSWORD_TEXT);
}
}