Наконец-то разобрались.
КАК мы все знаем, что Spring Security читает Session Id из cookie по умолчанию.В этом случае, поскольку я использовал @Bean public HttpSessionStrategy
, он читает из заголовка x-auth-token
.
Всякий раз, когда HttpInvokerProxyFactoryBean
пытается подключиться, контекст аутентификации распространяется, но, поскольку это HTTP-вызов, по умолчанию пытается использовать весенний фильтр сеанса.чтение идентификатора сеанса и подтверждение того же.Так как здесь идентификатор сессии не передается, он выдает 401.
Для того, чтобы это исправить.Мне нужно установить header
в HTTP invoker.То же самое относится, если используется cookie
.Поскольку HttpInvokerProxyFactoryBean
использует SimpleHttpInvokerRequestExecutor
.Я создал новый класс, расширив его и добавив заголовок, переопределив prepareConnection
.Я использовал setHttpInvokerRequestExecutor
в invoker, чтобы установить исполнителя для вызова нового класса.
Вот код.
Invoker:
@Configuration
@EnableAutoConfiguration
public class test {
@Bean
public HttpInvokerProxyFactoryBean invoker() {
HttpInvokerProxyFactoryBean invoker = new HttpInvokerProxyFactoryBean();
String serviceURL = "http://localhost:8081/rmi";
invoker.setServiceUrl(serviceURL);
invoker.setServiceInterface(rmiinterface.class);
invoker.setHttpInvokerRequestExecutor(httpInvokerRequestExecutor()); //call to the bean
return invoker;
}
@Bean
public SimpleHttpInvokerRequestExecutor httpInvokerRequestExecutor() {
return new CustomHttpInvokerRequestExecutor();
}
}
class CustomHttpInvokerRequestExecutor extends SimpleHttpInvokerRequestExecutor {
@Autowired
HttpSession session;
@Override
protected void prepareConnection(HttpURLConnection connection, int contentLength) throws IOException {
// adding header.
connection.addRequestProperty("x-auth-token", session.getId());
super.prepareConnection(connection, contentLength);
}
}
Теперь он начал работать.