繁体   English   中英

远程Spring Security授权

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM