远程Spring安全授权

时间:2016-04-17 07:16:08

标签: java spring spring-mvc spring-security

我目前正在使用Spring Security 4,使用默认配置一切正常。但是,当我在一台计算机(192.168.0.1)上安装Spring Web应用程序而在另一台计算机上安装HTML Server(192.168.0.2)时,如何使用192.168.0.2上的登录表单将Spring Security配置为授权。

Spring Security配置:

<http use-expressions="true" auto-config="true" >
  default-target-url="http://192.168.0.2/home.html"
</http>

目前,在192.168.0.2的登录表单中,我使用

<form method="post" action="http://192.168.0.1:8080/xxx/login">
    <input type="text" required name="username"/>
    <input type="password" required name="password"/>
    <button type="submit">Sign in</button>
</form>

在192.168.0.2上,用户可以传递授权。但是,我在192.168.0.2上的cookie中找不到任何JSESSIONID或任何相关的东西。

我的问题是,为了让Spring Security知道我是谁,我应该在后续ajax请求中包含哪些信息之王?

顺便说一句,如果我的授权失败,浏览器将被重定向到192.168.0.1/xxx/login,我该如何保留在我的自定义登录页面?

感谢。

1 个答案:

答案 0 :(得分:2)

为了简单起见,我们假设您有两台名为。

的计算机
AppIp    : 192.168.0.1
StaticIp : 192.168.0.2

现在,当您在浏览器中加载表单时,它会点击StaticIp。然后提交AppIp

这是发生了什么。当您将表单提交至AppIp时,它会返回JSESSIONID或要为Cookie设置的任何其他AppIp。因此,浏览器也会这样做,它会为AppIp而不是StaticIp设置Cookie。

一个域名(例如google.com)只能读取/写入自己的Cookie。浏览器不会设置谷歌为Facebook发送的cookie。

这就是为什么您无法在StaticIp资源中看到Cookie,如果您加载AppIp,您将能够在其资源中看到Cookie。

解决方案是在两台服务器前面都有一个代理服务器。例如Apache HTTPd或NGINX。

现在假设代理服务器为ProxyIp,配置完成如下。

ProxyIp/static maps to http://192.168.0.2/ (or http://AppIp/)
ProxyIp/app maps to http://192.168.0.1/ (or http://StaticIp/)

现在表单网址变为http://ProxyIp/static/home.html

/login网址将变为http://ProxyIp/app/xxx/login

现在浏览器中只有一个域ProxyIp,它可以为两个映射的服务器设置cookie。

注意:您无法发送正常的Ajax跨域请求。浏览器将阻止所有此类尝试。 Ajax请求只能发送到加载了执行Ajax脚本的HTML的域。它可以通过CORS的一些配置来完成,但这太痛苦和汗水了。