我的情景看起来如下: 1. 服务器 - 有很多域名 2. domain - 用Spring MVC编写的应用程序 3. apache2 - 在服务器上
在应用程序用户匿名时使用http,当他尝试登录应用程序时需要HTTPS。我是这样做的春天安全:
<http auto-config="true">
<intercept-url pattern="/user/add*" access="ROLE_ANONYMOUS" requires-channel="https"/>
<intercept-url pattern="/**" access="ROLE_USER, ROLE_ANONYMOUS"/>
<form-login login-page="/user/add" authentication-failure-url="/user/logFailed"></form-login>
<port-mappings>
<port-mapping http="8080" https="8181"/>
</port-mappings>
</http>
在本地计算机上工作正常,点击/用户/添加(登录页面)时重定向到https。 在服务器上我使用apache2上的代理传递我们:
<VirtualHost *:80>
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
Http运行良好,我的域上的每个HTTP请求都被重定向,而Glassfish获取它。
问题在于Https。我的代理通行证:
<IfModule mod_ssl.c>
<VirtualHost *domain*:8181>
ServerAdmin webmaster@localhost
ServerName *server*
ServerAlias www.*domain*
DocumentRoot /var/www/*domain*/
<Directory /var/www/*domain*/>
Options -Indexes
</Directory>
ProxyPass / https://127.0.0.1:8181/
ProxyPassReverse / https://127.0.0.1:8181/
我尝试了很多不同的配置,但我不知道问题出在哪里。请求被重定向到https但在地址127.0.0.1上,这当然是localhost。当我将ProxyPass更改为域名时,它的工作原理相同。
我必须重新配置?
也可以让Glassfish在443端口工作,而不是8181 ???
答案 0 :(得分:0)
我猜你的本地配置不包含前面的apache而你让Glassfish处理SSL?这就是它在本地工作没有问题的原因。
Apache配置不是我强大的领域,但让我试一试:如果您现在尝试直接在服务器上访问端口8181,您甚至不需要使用代理传递配置,因为您的GF已在运行那里。这就是为什么你被重定向到127.0.0.1(因为配置毫无意义,它在相同的端口上进行代理传递)。您还可能在服务器hosts-file中遗失您的域。
您要做的只是在80上使用虚拟主机,并将代理传递到8080(在8181虚拟主机中定义ServerAdmin等),让Glassfish和Spring处理非匿名身份验证的重定向。 / p>
另一个选择是将SSL移动到Apache:443虚拟主机代理到8181并相应地修改Spring Security配置(端口映射https到443)。
关于直接运行GF的问题:443,你是在Windows上运行还是在UNIX上运行?在Windows上,通过管理控制面板修改https-listener,可以将Glassfish直接绑定到端口443:配置 - &gt; server-config - &gt; HTTP服务 - &gt;修改启用了安全性的http侦听器上的端口值。您也可以直接在domain.xml中修改http-listener元素的端口值
在类UNIX上它有点问题,因为不允许应用程序在1024以下的端口上绑定。在这种情况下,您可以在前面配置iptables redirection并将所有流量从443重定向到8181(或任何端口) Glassfish正在运行的1024以上)。
我认为你需要停一秒钟并权衡选项,无论是否在前面使用apache,或者让Glassfish直接使用iptables配置执行所有http(s)处理。 This thread有详细信息可以帮助您拨打电话。
我希望这有用,你的问题范围很广,如果你能决定是否使用apache以及在哪里做SSL,那么提供更具体的建议会更容易。您此时的Spring安全配置看起来简单而正确,只需要弄清楚上面的内容。