我们有一个三层架构,我们正在结合使用 spring 远程处理和 hessian。目前我们有一个客户端应用程序,业务应用程序在两个不同的 tomcat 上运行。
Tomcat 1 Tomcat 2 ---------- ------------ | client | -> | business | ---------- ------------ exposing services for clients
但是我们遇到了一个安全问题。我们公开的服务(业务应用程序)需要具有特殊权限的登录用户,例如 ROLE_SUPERVISOR。客户端应用程序有一个登录表单,凭据验证由业务应用程序完成(客户端应用程序没有数据库连接)。这意味着用户只登录客户端应用程序,业务应用程序对此一无所知(这可能是主要问题)。
我们认为使用 spring security 远程处理将所有需要的信息从客户端发送到业务应用程序(即身份验证对象)是可能的。但不幸的是,这是无法做到的。所以,我们必须找到另一种解决方案。
一种解决方案可能是将身份验证对象与每个请求一起发送。但这可能还有另一个安全问题。客户端发送的身份验证对象可以被攻击者伪造。在这种情况下,我们必须检查每个请求的用户凭据并加载他的角色(授予权限)以确保他被授权。
第二种解决方案是两个应用程序都知道登录的用户,这意味着,当用户使用客户端应用程序登录时,他也登录了业务应用程序。但是,无论如何,用户(或授权)对象必须随每个请求一起发送。
也许我们错过了一些东西。使用弹簧安全和弹簧远程处理是否有更好/更简单的方法来做到这一点。三层架构并不罕见,必须有一种方法来保护暴露的服务。
使用 hessian更新 spring 远程处理:客户端配置(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;
}
我感谢您的帮助!谢谢,丹尼尔