如何使用具有粗麻布和弹簧安全性的弹簧远程处理?

时间:2014-05-12 14:35:59

标签: spring tomcat spring-security hessian spring-remoting

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

 Tomcat 1           Tomcat 2
----------        ------------
| client |   ->   | business |
----------        ------------
                   exposing services for clients

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

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

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

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

也许我们错过了什么。使用弹簧安全和弹簧远程处理是不是有更好/更简单的方法。三层架构并不罕见,必须有一种方法来保护公开的服务。

更新 用hessian进行spring remoting:客户端配置(java config)

@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;
}

感谢您的帮助! 谢谢,丹尼尔

0 个答案:

没有答案