无法在 Spring Security 中用自定义替换标准登录表单

Posted

技术标签:

【中文标题】无法在 Spring Security 中用自定义替换标准登录表单【英文标题】:Cannot replace standard login form with custom in Spring Security 【发布时间】:2015-06-12 12:06:47 【问题描述】:

当我要访问 localhost/SpringMVC/login 时,服务器会将我指向默认登录页面,而不是我创建的页面。 Security.xml 似乎被正确包含,因为工作正常。我正在使用 Spring Security 4.0.0 这是我的安全配置:

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/forRegisteredUsersOnly" access="hasRole('ROLE_USER')" />
    <form-login 
        login-page='/login'
        authentication-failure-url="/login?error=true" 
        login-processing-url="/j_spring_security_check" />
    <logout logout-success-url="/" logout-url="/j_spring_security_logout" />
</http>

web.xml:

  <listener>
    <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
            /WEB-INF/webapp-servlet.xml
            /WEB-INF/webapp-security.xml
        </param-value>
  </context-param>

  <servlet>
    <servlet-name>webapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>webapp</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <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>

登录控制器.java:

@Controller
public class LoginController 

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public ModelAndView getLoginForm(@RequestParam(required=false) String authFailed, String logout) 
        String message="";
        if(authFailed != null) 
            message = "Invalid username or password, try again !";
         else if (logout != null) 
            message = "Logged Out successfully, login again to continue!";
        
        return new ModelAndView("login", "message", message);
    

ViewResolver 然后将“登录”映射到 /WEB-INF/views/login.jsp(映射在其他页面上工作正常)

更新: 我不知道为什么,但我的登录表单可以在 localhost/SpringMVC/login.html 找到。如何将其更改为 localhost/SpringMVC/login ?

【问题讨论】:

【参考方案1】:

使用双引号作为登录页面的值并尝试添加 default-target-url 。

<http auto-config="true" use-expressions="true">
     <intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
     <intercept-url pattern="/forRegisteredUsersOnly" access="hasRole('ROLE_USER')" />
     <form-login 
          login-page="/login"
          default-target-url="/home"
          authentication-failure-url="/login?error=true" 
          login-processing-url="/j_spring_security_check" />
     <logout logout-success-url="/" logout-url="/j_spring_security_logout" />
</http>

【讨论】:

以上是关于无法在 Spring Security 中用自定义替换标准登录表单的主要内容,如果未能解决你的问题,请参考以下文章

自定义登录表单无法使用 Spring Security

Spring Security - 无法将默认登录页面更改为自定义

无法在 Spring Boot Security 中登录到我的自定义登录页面

无法为 Spring Security 提供自定义身份验证提供程序

spring security 无法添加自定义身份验证提供程序

无法使用带有自定义 UserDetail 和 AuthenticationProvider 的 Spring Security 来阻止用户多次登录