我们有三层架构,我们使用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;
}
感谢您的帮助! 谢谢,丹尼尔