java - 如何使用 Spring Security 实现登录页面,以便它与 Spring Web 流程一起工作?

标签 java spring-mvc spring-security spring-webflow

我有一个使用 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 以协同工作。

最佳答案

这里的文档描述了为什么需要“springSecurityFilterChain”。

springSecurityFilterChain过滤器不是显式创建的,而是由<http>隐式创建的应用程序上下文中的 spring security 模式元素

<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

有了这些更改,包括已编辑问题中所述的安全过滤器配置,页面将正确呈现,并且配置的安全堆栈将在每个服务页面上到位。

这些细节和一个简单的 spring-security 应用程序的演练在 A aimple web application with Spring Security - part 13 中给出。 .

引用文档描述了如何设置 springSecurityFilterChain作为配置 web.xml 的第一部分:Security Namespace Configuration - Getting Started . (链接到 OP 使用的 2.0.x 版本。最新版本 3.1 是 here。)

关于java - 如何使用 Spring Security 实现登录页面,以便它与 Spring Web 流程一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2882474/

相关文章:

java - 如何在基于eclipse的Spring项目中添加bean配置文件?

java - IAIK PKCS#11 包装器无法初始化

java - Spring - RestTemplate - 多部分文件

java - Gradle 5.1 上的依赖关系解析失败

java - AJAX 调用失败时出现未定义的 Javascript 错误

Grails 自定义安全评估器

java - Spring Session 与 Spring Security 创建两个 session

java - 尽管正确提供了角色,Spring Security 授权仍无法正常工作

java - Encog::非收敛错误率

JavaFX BarChart 不更新