为啥 https 中使用 Spring Security 添加端口 80?

Posted

技术标签:

【中文标题】为啥 https 中使用 Spring Security 添加端口 80?【英文标题】:Why is port 80 added with Spring Security in https?为什么 https 中使用 Spring Security 添加端口 80? 【发布时间】:2012-02-07 02:42:26 【问题描述】:

登录时,我的应用程序从 443 重定向到 80 : 原始网址是https://myhost.com/myapp/login.jsp 但是当我提交 URL https://myhost.com/myapp/j_spring_security_check 时,登录成功,尝试连接到 https://myhost.com:80强>/myapp/

URL https://myhost.com/myapp/login.jsp 调用 apache 服务器。 这个 apache 使用 http(端口 11080)调用了一个 tomcat。

登录操作由具有该配置的 Spring Security 处理:

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
    <global-method-security secured-annotations="enabled">
    </global-method-security>
    <http auto-config="true">
        <intercept-url pattern="/faces/secure/**" access="ROLE_ADMIN" />
        <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/>
        <logout logout-success-url="/index.jsp"/>
        <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true"/>
    </http>
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
</beans:beans>

这个问题只存在于登录和注销操作,所以我认为 Spring Security 是问题所在。

一切正常,当原始 URL 不使用默认 https 端口 443 时没有重定向:https://myhost.com:12345/myapp/login.jsp

当 apache 使用协议 ajp 调用 Tomcat 时,一切正常。

不幸的是,我必须在端口 443 上调用 apache,并使用协议 http 调用 Tomcat。

线程Spring Security Https Wrong Port 几乎是我的问题,除了我不使用https 调用Tomcat,而是使用http。

我的 Tomcat 连接器配置是:

<Connector port="11080" maxHttpHeaderSize="8192"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true" />

<Connector port="11009" 
           enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

【问题讨论】:

请发布您的 tomcat 连接器配置。内部服务器配置(用于重定向)可能存在问题。当您使用 AJP 时它会起作用,这一事实使这种情况更有可能发生。 【参考方案1】:

问题似乎是指令 response.sendRedirect 在 Spring 安全性中用于登录,在我的应用程序中用于注销:

response.sendRedirect(response.encodeRedirectURL(finalUrl));

为了解决这个问题,我在tomcat中添加了一个阀门,如本文所述:http://blog.inuus.com/vox/2009/04/tomcat-and-ssl-accelerators.html

【讨论】:

【参考方案2】:

接受的答案是建议使用依赖于 Microsoft 特定标头 (Front-End-Https) 的自定义阀门。相反,您应该使用已经提供的 RemoteIpValve 并依赖事实上的标准 x-forwarded-proto 标头。

AJP 代理无需额外工作的原因是它是一个二进制协议,因此 Web 服务器/负载均衡器和 Tomcat 之间没有 HTTP 调用,因此没有架构/端口更改问题。

【讨论】:

以上是关于为啥 https 中使用 Spring Security 添加端口 80?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Spring Saml 中忽略 cacerts?

Spring boot 和 Spring Actuator - 禁用安全性

Spring:为啥在端点中返回整个 OAuth2User 是不好的?

Spring Boot 桌面独立应用程序中的 Apache Shiro

在Junit 5测试中注入Spring数据存储库

带有 spring-boot 和 spring-security 的 JWT