如何将SpringRemoting与hessian和SpringSecurity结合使用?

如何将SpringRemoting与hessian和SpringSecurity结合使用?,spring,tomcat,spring-security,hessian,spring-remoting,Spring,Tomcat,Spring Security,Hessian,Spring Remoting,我们有一个三层架构,我们将SpringRemoting与hessian结合使用。目前,我们有一个客户端应用程序,业务应用程序运行在两个不同的Tomcat上 但是我们遇到了一个安全问题。我们的公开服务(业务应用程序)需要具有特殊权限的登录用户,例如ROLE_SUPERVISOR。客户端应用程序具有登录表单,凭据验证由业务应用程序完成(客户端应用程序没有数据库连接)。这意味着用户只登录到客户端应用程序,而业务应用程序对此一无所知(这可能是主要问题) 我们认为使用SpringSecurityRemot

我们有一个三层架构,我们将SpringRemoting与hessian结合使用。目前,我们有一个客户端应用程序,业务应用程序运行在两个不同的Tomcat上

但是我们遇到了一个安全问题。我们的公开服务(业务应用程序)需要具有特殊权限的登录用户,例如ROLE_SUPERVISOR。客户端应用程序具有登录表单,凭据验证由业务应用程序完成(客户端应用程序没有数据库连接)。这意味着用户只登录到客户端应用程序,而业务应用程序对此一无所知(这可能是主要问题)

我们认为使用SpringSecurityRemoting可以将所有需要的信息从客户端发送到业务应用程序(即身份验证对象)。但不幸的是,这无法做到。因此,我们必须找到另一个解决方案

  • 一种解决方案是将身份验证对象与每个请求一起发送。但这可能还有另一个安全问题。攻击者可以伪造客户端发送的身份验证对象。在这种情况下,我们必须检查每个请求的用户凭据,并加载他的角色(授予的权限),以确保他得到授权

  • 第二个解决方案是,两个应用程序都知道登录的用户,这意味着,当用户使用客户端应用程序登录时,他也会登录到业务应用程序。但是,无论如何,用户(或授权)对象必须与每个请求一起发送

也许我们错过了什么。使用spring安全性和spring远程处理是否有更好/更简单的方法来实现这一点。三层体系结构并不少见,必须有一种方法来保护公开的服务

更新 使用hessian的spring远程处理:客户端配置(java配置)

业务方面:

@Bean(name = "/XyService")
public HessianServiceExporter xyService() {
    HessianServiceExporter hessianServiceExporter = new HessianServiceExporter();
    hessianServiceExporter.setServiceInterface(XyService.class);
    hessianServiceExporter.setService(xyServiceImpl);
    return hessianServiceExporter;
}
我感谢你的帮助!
谢谢,Daniel

到底什么是“不能做”的,为什么?不可能“准备”远程调用来发送身份验证对象(或类似的东西)以及原始请求。spring安全远程处理只有两个选项:1。http基本身份验证和2。使用rmi发送身份验证对象。两者都不是选项。您如何执行远程呼叫?Hessian本质上是一种编码,不清楚为什么不能使用
HttpInvoker
。我可以使用HttpInvoker,但我不明白为什么这会有帮助,因为使用spring安全远程处理只能进行http基本身份验证。我更新了我的问题并添加了我的配置。正如您已经注意到的,唯一的可能性是使用Spring安全远程处理,这只适用于基本身份验证,因为Hessian只是HTTP,但它只是对请求进行编码。如果您想要其他东西,您必须自己实现它来序列化/反序列化
身份验证
对象,但是为什么不能使用简单的基本身份验证(缺点是您必须在后端进行一次身份验证)。
@Bean
public HessianProxyFactoryBean xyService() {
    HessianProxyFactoryBean xyService = new HessianProxyFactoryBean();
    xyService.setServiceUrl(remotingUrl + remotingContextPath + "/XyService");
    xyService.setServiceInterface(XyService.class);

    return xyService;
}
@Bean(name = "/XyService")
public HessianServiceExporter xyService() {
    HessianServiceExporter hessianServiceExporter = new HessianServiceExporter();
    hessianServiceExporter.setServiceInterface(XyService.class);
    hessianServiceExporter.setService(xyServiceImpl);
    return hessianServiceExporter;
}