[英]Spring Security authorization remotely
我目前正在使用Spring Security 4,并且使用默认配置可以正常工作。 但是,当我在一台机器(192.168.0.1)上保存Spring Web应用程序而另一台机器(192.168.0.2)上保存HTML Server时,如何使用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
,如何保留在自定义登录页面中?
谢谢。
为了简化起见,假设您有两台计算机。
AppIp : 192.168.0.1
StaticIp : 192.168.0.2
现在,当您在浏览器中加载表单时,它将点击StaticIp
。 依次提交给AppIp
。
这是正在发生的事情。 将表单提交给AppIp
,它将返回JSESSIONID
或要为AppIp
设置的任何其他Cookie
。 因此,浏览器执行相同的操作,它为AppIp
而不是StaticIp
设置cookie。
一个域(例如google.com)只能读取/写入其自己的Cookie。 浏览器不会设置Google发送给Facebook的Cookie。
这就是为什么您无法在StaticIp
资源中看到Cookie的StaticIp
,如果您加载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/)
因此,现在表单URL变为http://ProxyIp/static/home.html
并且/login
URL将变为http://ProxyIp/app/xxx/login
现在,对于浏览器而言,只有一个域ProxyIp
,它将能够为两个映射的服务器设置cookie。
注意:您不能发送普通的Ajax跨域请求。 浏览器将阻止所有此类尝试。 Ajax请求只能发送到加载了执行Ajax脚本的HTML的域。 可以通过对CORS进行一些配置来完成此操作,但是这太麻烦了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.