0

我有一个通过 HttpInvoker 实现的弹簧远程处理。我的客户和服务如下所示,取自 spring 文档 我遵循了 spring 文档:(抱歉,由于公司政策,我无法发布实际代码)=>spring docs

我的 httInvoker 服务受 spring security 保护,在客户端我有以下客户端代码以及 httpinvokerrequestexecutor 如下:

    <bean id="httpProxybean" class="org.springframework....HttpInvokerProxyFactoryBean>
    <property name=".." ref="executor"/>
<property name="service"...
</bean>

    <bean id="executor" class='org......HttpInvokerRequestExecutor/>

我遇到的问题是当我尝试从测试客户端测试服务时,如下所示:我得到......无法连接到 http 远程服务:401 未经授权

public static void main(String [] args){

    Application context = new XmlPathApplicationContext("client.xml");
Service service =(Service) context.getBean("service");
}

如果我错了,请纠正我,我假设我是因为 HttpInvokerRequestExecutor 而得到的。现在,当我尝试按如下方式传递用户名和密码时: 我从一个示例中获取它。我仍然遇到同样的错误,无法连接到 http 远程服务:401 unauthorized。当我删除 HttpInvokerRequestExecutor 并禁用服务的拦截 URL 时,它工作正常。

public static void main(String [] args){
    final ApplicationContext context =

new ClassPathXmlApplicationContext(

"client/spring-http-client-config.xml");

String user = "bob";

String pw = "bob";

SecurityContextImpl sc = new SecurityContextImpl();

Authentication auth = new UsernamePasswordAuthenticationToken(user,

pw);



sc.setAuthentication(auth);

SecurityContextHolder.setContext(sc);


    Service service =(Service) context.getBean("service");
    }

为测试目的而配置的安全配置 xml 是

<authenticationManager>
.....................
<user username="bob" password="bob" authorities ="ROLE_ADMIN">
..........................
</authenticationManager>

拦截网址是 <intercept-url path="/remoting/*" access="hasRole('ROLE_ADMIN'). 现在问题:我。测试客户端时,如何将凭据从客户端传递到服务器?请记住,我的服务受 Spring Security 保护,因此我想将 Security 上下文从客户端传递到服务器,以便服务器可以对其进行身份验证。ii. 测试时,如果我删除 HttpInvokerRequestExecutor 并在服务器端,我可以访问服务,我禁用拦截 URL 过滤器以访问服务。我非常感谢您在这方面的帮助。我一直在寻找解决方案 iii。请给我一些关于如何将凭据从客户端传递到服务器端的想法,以及在测试时这是否可行?

4

1 回答 1

0

看看AuthenticationSimpleHttpInvokerRequestExecutor

(如果您使用 maven,则可以在spring-security-remoting依赖项中找到它。)

它将从中选择身份验证信息SecurityContextHolder

于 2014-09-18T07:12:46.667 回答