我有一个使用Spring 2.5.6和Spring Security 2.0.4的Web应用程序。我已经实现了一个工作登录页面,它根据Web服务对用户进行身份验证。通过定义自定义验证管理器来完成验证,如下所示:
<beans:bean id="customizedFormLoginFilter"
class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
<custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
<beans:property name="defaultTargetUrl" value="/index.do" />
<beans:property name="authenticationFailureUrl" value="/login.do?error=true" />
<beans:property name="authenticationManager" ref="customAuthenticationManager" />
<beans:property name="allowSessionCreation" value="true" />
</beans:bean>
<beans:bean id="customAuthenticationManager"
class="com.sevenp.mobile.samplemgmt.web.security.CustomAuthenticationManager">
<beans:property name="authenticateUrlWs" value="${WS_ENDPOINT_ADDRESS}" />
</beans:bean>
身份验证管理器类:
public class CustomAuthenticationManager implements AuthenticationManager, ApplicationContextAware {
@Transactional
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
//authentication logic
return new UsernamePasswordAuthenticationToken(principal, authentication.getCredentials(),
grantedAuthorityArray);
}
登录jsp的基本部分如下所示:
<c:url value="/j_spring_security_check" var="formUrlSecurityCheck"/>
<form method="post" action="${formUrlSecurityCheck}">
<div id="errorArea" class="errorBox">
<c:if test="${not empty param.error}">
${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</c:if>
</div>
<label for="loginName">
Username:
<input style="width:125px;" tabindex="1" id="login" name="j_username" />
</label>
<label for="password">
Password:
<input style="width:125px;" tabindex="2" id="password" name="j_password" type="password" />
</label>
<input type="submit" tabindex="3" name="login" class="formButton" value="Login" />
</form>
现在的问题是应用程序应该使用Spring Web Flow。在将应用程序配置为使用Spring Web Flow之后,登录不再起作用 - 对“/ j_spring_security_check”的表单操作会导致空白页面没有错误消息。调整现有登录过程以使其适用于Spring Web Flow的最佳方法是什么?
修改:没有错误消息,只显示空白页面。它现在有效 - 问题是web.xml缺少条目
<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和Web Flow一起工作。
答案 0 :(得分:2)
这里的文档描述了为什么需要'springSecurityFilterChain'。
springSecurityFilterChain过滤器不是显式创建的,而是由应用程序上下文中的<http>
spring安全模式元素隐式创建的
<http auto-config="false" session-fixation-protection="none">
<form-login login-page="/login.jsp" default-target-url="/home.htm" />
</http>
创建的bean需要身份验证提供程序,因此我们提供了一个
<authentication-provider>
<user-service id="userDetailsService">
<user password="password" name="username" authorities="ROLE_USER" />
</user-service>
</authentication-provider
通过这些更改(包括编辑问题中所述的安全筛选器的配置),页面将正确呈现,并且配置的安全堆栈将在每个所服务的页面上就位。
A aimple web application with Spring Security - part 13中提供了这些详细信息以及一个简单的弹簧安全应用程序。
参考文档描述了将springSecurityFilterChain
设置为配置web.xml的第一部分:Security Namespace Configuration - Getting Started。
(链接到OP使用的2.0.x版本。最新版本3.1是here。)
答案 1 :(得分:1)
根据您的代码,目前尚不清楚您是否拥有Spring Security配置。我假设你没有。
您必须在配置中添加安全名称空间。像这样的东西
<beans xmlns="http://www.springframework.org/schema/beans" ... skipped ...
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
... skipped ...
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
您需要配置Spring Security。例如:
<beans xmlns="http://www.springframework.org/schema/beans" ... skipped ...
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
... skipped ...
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
这可能足以让它“正常工作”,但我认为你应该看一下实现你的AuthenticationProvider而不是AuthenticationManager。在这种情况下,您需要与此类似的配置:
<security:http once-per-request="false" auto-config="false">
<security:form-login login-page="path/to/your/login.jsp"/>
</security:http>
答案 2 :(得分:0)
您是否根据Securing Flows的Spring Web Flow Reference Guide章节将应用配置为使用Spring Web Flow?
答案 3 :(得分:0)
我不得不将我的表单名称从j_security_check更改为glassfish上的其他内容,因为它似乎解释了该url本身。