2

我有一个启用了spring-security 3.1.0的 webapp,它在本地使用时工作得很好。

mvn jetty:run

当远程部署在码头上(在端口 80 上的 nginx 后面)时,spring-security 停止一起工作。也就是说,除了受保护的部分之外,webapp 的其余部分都可以工作。


问题

当我导航到安全位置时,我会被重定向到登录页面,以便该部分正常工作。问题是提交登录表单时似乎什么也没有发生。我总是像什么都没发生一样回到登录表单。

当我尝试记录事件时,spring-security 完全保持沉默。这可能是一个线索...

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
log4j.rootLogger = INFO, stdout
log4j.logger.org.springframework.security=DEBUG

我能想到的唯一与我的本地设置真正不同的是,在远程服务器上,nginx 位于码头前面。

有人知道这里可能出了什么问题吗?

以下是配置的相关部分。

nginx

location /test-app {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:8080/test-app;
}

web.xml(弹簧安全)

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

弹簧安全.xml

<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-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

        <authentication-manager alias="authenticationManager">
                <authentication-provider>
                        <user-service>
                                <user name="test" password="test" authorities="ROLE_USER, ROLE_ADMIN" />
                        </user-service>
                </authentication-provider>
        </authentication-manager>

        <http auto-config="true">
                <intercept-url pattern="/secured/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
                <intercept-url pattern="/secured/**" access="ROLE_USER" />

                <form-login login-page="/secured/login" login-processing-url="/secured/login/auth"
                        authentication-failure-url="/secured/login?error=BadCredentials"
                        username-parameter="username" password-parameter="password"
                        default-target-url="/secured" />

                <logout logout-url="/secured/logout" logout-success-url="/secured" />
        </http>
</beans:beans>
4

2 回答 2

1

如果您使用端口 8080 直接连接到远程码头,它是否工作?

如果是,则问题可能与 nginx 有关。

当 Spring Security 身份验证成功时,它应该能够通过响应中的 Set-Cookie 标头在浏览器上设置 cookie。也许 nginx 在这方面有问题。

您可以使用 Chrome 的流量进行调试,按 F12 并打开网络选项卡。转到登录页面并尝试登录。如果成功,您应该能够在 Cookies 选项卡中看到 cookie JSESSIONID。

于 2013-07-18T12:42:12.403 回答
0

我的问题是一样的。正如我所认识到的,当 URL 不包含尾部斜杠时,我的应用程序会进行重定向。

例如: http ://example.com/myapp --> http://example.com/myapp/重定向。

当您激活 spring security 并从第一个 url 开始,然后重定向到http://example.com/login,在成功验证后返回http://example.com/myapp,新的循环开始.

尝试在 URL 末尾添加斜杠的应用程序,或者检查当用户键入没有尾部斜杠的 URL 时如何解决此问题。

于 2014-03-01T17:24:50.610 回答