Spring security *always* 重定向到登录表单
Posted
技术标签:
【中文标题】Spring security *always* 重定向到登录表单【英文标题】:Spring security *always* redirects to login form 【发布时间】:2013-07-17 04:10:10 【问题描述】:我有一个启用了 spring-security 3.1.0 的 web 应用程序,在本地使用它工作得很好。
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 (spring-security)
<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>
spring-security.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>
【问题讨论】:
"login-processing-url="/secured/login/auth" 中发生了什么? @Hippoom 它被 web.xml 中定义的过滤器链在某处捕获。它由 spring-security 处理。 【参考方案1】:我的问题是一样的。我认识到,当 URL 不包含尾部斜杠时,我的应用程序会进行重定向。
例如: http://example.com/myapp --> http://example.com/myapp/ 重定向。
当您激活 spring security 并从第一个 url 开始,然后重定向到 http://example.com/login,在成功验证后返回到 http://example.com/myapp,并开始新的循环。
尝试在 URL 末尾添加斜杠的应用,或检查当用户键入不带斜杠的 URL 时如何解决此问题。
【讨论】:
【参考方案2】:如果您直接使用端口 8080 连接到远程码头,它是否工作?
如果是,问题可能与nginx有关。
当 Spring Security 认证成功时,它应该能够通过响应中的 Set-Cookie 标头在浏览器上设置一个 cookie。也许 nginx 在这方面有问题。
您可以使用 Chrome 的流量进行调试,按 F12 并打开网络选项卡。转到登录页面并尝试登录。如果成功,您应该能够在 Cookies 选项卡中看到 cookie JSESSIONID。
【讨论】:
感谢您的回复。当我有机会时,我会检查。在调试时,我总是在 chrome 中打开开发人员工具,我看到设置了 cookie。让我担心的是,我在问题中的配置中找不到任何有关 Spring Security 的日志条目。 直接连接到码头让一切正常,所以它肯定是 nginx 破坏了所有的乐趣。 我找到了罪魁祸首!在更改了我的部分 sites-available/default 配置后,我发现我的更改没有任何效果。我查看了 sites-enabled 文件夹,发现了一个名为 default 的文件以及一些旧设置。我用指向正确配置的符号链接替换了该文件,现在一切都很好。感谢您的支持!以上是关于Spring security *always* 重定向到登录表单的主要内容,如果未能解决你的问题,请参考以下文章
[Security] Always use parameterized queries
Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core
Spring mvc / security:从spring security中排除登录页面
Spring Security:2.4 Getting Spring Security