未调用 Spring Security 自定义登录表单

Posted

技术标签:

【中文标题】未调用 Spring Security 自定义登录表单【英文标题】:Spring security custom login form not invoked 【发布时间】:2015-11-30 09:21:47 【问题描述】:

我正在尝试将 Spring MVC Web 应用程序配置为使用自定义登录表单进行使用注释的身份验证。我的问题是自定义登录表单永远不会打开,但我总是得到标准的 Spring Security 登录表单。

我已经定义了以下SecurityConfiguration 类:

package com.test.spring.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

@EnableWebSecurity
public class SecurityConfiguration 

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    

    protected void configure(HttpSecurity http) throws Exception 
        http
            .authorizeRequests()
                .antMatchers("/login").permitAll()  
                .antMatchers("/resources/**").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/home")
                .usernameParameter("user_login")
                .passwordParameter("user_password")
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login")
                .permitAll()
                .and()
            .csrf()
                .and()
            .sessionManagement()
                .invalidSessionUrl("/login?time=1")
                .maximumSessions(10);
    


还有SecurityWebApplicationInitializer类:

package com.test.spring.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer 


我还创建了自定义登录表单为login.html,所以我假设配置将加载我的login.html 文件,而不是标准的spring 安全登录表单。

无论我做什么,我总是得到标准的登录表单:

我还配置了我的控制器:

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login() 
        return "login";
    

似乎我的安全配置根本没有加载。

问题出在哪里?

【问题讨论】:

只是为了测试你访问/spring/login.html时拥有的东西 关注这个,可能你错过了URL docs.spring.io/spring-security/site/docs/3.2.x/guides/form.html的控制器配置 /spring/login.html 使用标准登录表单重定向回 /spring/login 我也在关注 spring 安全指南,但它无助于解决我的问题......仍在试图找出问题所在 你做了这个 registry.addViewController("/login").setViewName("login"); 【参考方案1】:

终于明白了。

解决方案非常简单。我的安全配置根本没有加载,因为SecurityConfiguration 类必须扩展WebSecurityConfigurerAdapter

之后,配置已加载,一切都按预期工作。

所以,改为

public class SecurityConfiguration

应该有

public class SecurityConfiguration extends WebSecurityConfigurerAdapter

【讨论】:

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

Spring Security 未路由到自定义登录页面 404 错误

Spring Security - 自定义登录表单未在提交时调用 AuthenticationProvider

Spring安全性j_spring_security_check调用给出404未找到错误[关闭]

Spring-security/Grails 应用程序 - 未调用自定义 WebSecurity 配置

Spring security - 未调用自定义 userDetailsS​​ervice 实现

JSF / Spring Security - 添加其他登录字段不会调用自定义过滤器