我正在尝试获得我的春天+休眠+弹簧安全性和tiles2 - " HelloWorld"申请工作,遵循this guide(不幸的是德语)。
我的问题是我得到了一个" 404"登录我的应用程序时出现错误消息。重定向到登录页面按预期工作,但我无法达到" http://localhost:8080/App/j_spring_security_check"当我点击登录按钮时。
我的web.xml看起来像这样:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/defs/applicationContext.xml
/WEB-INF/defs/applicationContext-security.xml
</param-value>
</context-param>
<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>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
和applicationContext-security.xml文件看起来就是这样......
<http use-expressions="true">
<intercept-url pattern="/index.html" access="permitAll" />
<intercept-url pattern="/timeout.html" access="permitAll" />
<intercept-url pattern="/redirect.html" access="permitAll" />
<intercept-url pattern="/media/**" access="permitAll" />
<intercept-url pattern="/includes/**" access="permitAll" />
<intercept-url pattern="/office/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/office/admin/**" access="hasRole('ROLE_ADMIN')" />
<form-login login-page="/index.html"
authentication-failure-url="/index.html?login_error=1"
default-target-url='/office/kunden.html'
always-use-default-target='true'
/>
<logout logout-success-url="/index.html" />
<remember-me />
<session-management invalid-session-url="/index.html">
<concurrency-control max-sessions="2" error-if-maximum-exceeded="true" />
</session-management>
</http>
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref="mysqldataSource"
authorities-by-username-query="select username, authority from benutzer where username = ?"
users-by-username-query="select username, password, enabled from benutzer where username = ?"/>
</authentication-provider>
</authentication-manager>
数据库连接似乎是O.K。
如果有人可以给我一个提示,我会很高兴,因为我已经做了很多谷歌搜索,但还没有找到解决方案。
我使用spring 3.1和tomcat 7.0.23
答案 0 :(得分:2)
我会检查两件事:
要检查请求调度,首先要确保在servlet容器中确保您的应用程序可以访问。意思是,你提到了http://localhost:8080/App/j_spring_security_check。您的应用程序可以在该URL下访问吗? http://localhost:8080/App是否显示正确的内容(HTTP 200)? 同时确保调度程序servlet配置正确。在您提供的教程中,有这一部分:
<!-- Spring Hauptteil -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
如果您没有在web.xml中提供它,那么在最终通过spring-security检查之前,您的请求可能甚至无法正确发送。
如果这对您没有帮助,请尝试此操作。
在documentation之后,最小配置应足以检查您的设置是否正确。如果你已经按照教程,你可能会犯一些小错误(例如,typeo)会导致spring-security无法正常启动。然后很容易在logger输出中跳过一些错误信息。 我建议你做以下几点。
如果您得到正确的回复 - 尝试修改配置,直到完成为止。
指向学习
DelegatingFilterProxy
(在web.xml中定义)真正做的是将请求委托给Spring的IoC管理的其他过滤器。此过滤器通过安全命名空间在applicationContext-security中定义。如果由于某种原因这不起作用,过滤器将不会被初始化,并且您最终可能会看到http 404而不管其他应用程序是否正常启动。
Uffff,很多文字;)
答案 1 :(得分:0)
您的配置看起来不错。如果default-target-url='/office/kunden.html'
指向不存在的控制器或视图,那么404的一个例子就是它。
检查网址/office/kunden.html
是否有效 - 因此停用安全资料(只需添加<security:intercept-url pattern="/**" access="permitAll" />
)并尝试使用。
另一个可能出错的问题是,本教程是针对spring 3.0而不是spring 3.0。我不希望这是原因,但试一试并降级。
答案 2 :(得分:0)
对于那些面临相同症状,但针对不同情况的人,那些在负载均衡器后面进行SSL卸载的人,以下答案可能会让您朝着正确的方向前进。我有一个类似的问题,结果是传入的请求处理正确,但是作为响应弹簧安全性发送重定向到由default-target-url
属性定义的绝对URL(以http而不是https开头)< / p>
<security:form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true" />
现在,客户端浏览器尝试在http上打开重定向的位置,在loadbalancer上失败(仅接受https流量)并报告404 NOT FOUND
我们通过在负载均衡器中为端口443(https)上的所有传入请求添加以下mod_header
指令来解决此问题:
RequestHeader set X-Forwarded-Proto "https"
将添加一个额外的标题。如果您运行Jetty之类的应用程序服务器,它将识别此标头并转换传入的请求。 (见http://www.gossamer-threads.com/lists/apache/users/407272)