繁体   English   中英

没有Spring Boot的Spring Security身份验证与Spring Boot和类似配置不兼容

[英]Spring security authentication without spring boot doesn't work as opposed to with spring boot and similar configuration

使用Spring Boot:

正常运行的Spring Boot + Spring Security应用程序将其用于请求映射:

@SpringBootApplication
public class SampleLDAPApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SampleLDAPApplication.class, args);
    }

    @Bean
    public WebMvcConfigurerAdapter adapter() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/login")
                    .setViewName("login");
            }
        };
    }

}

这是安全配置:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.ldapAuthentication().userSearchBase("ou=Users").userSearchFilter("(uid={0})")
                .groupSearchBase("ou=bla,ou=Roles").groupSearchFilter("(roleOccupant={0})")
                .contextSource().root("dc=ops,dc=blabla,dc=com").url("ldap://192.168.1.57:389/dc=ops,dc=blabla,dc=com");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/", "/home").permitAll().anyRequest().authenticated();
        http.formLogin().loginPage("/login").permitAll().and().logout().logoutSuccessUrl("/");
    }
}

这是登录页面:

<div class="content">
    <h2>Login with Username and Password</h2>
    <form name="form" th:action="@{/login}" method="POST">
        <fieldset>
            <input type="text" name="username" value="" placeholder="Username" />
            <input type="password" name="password" placeholder="Password" />
        </fieldset>
        <input type="submit" id="login" value="Login"/>
    </form>
</div>

每当我访问保留的/secure URL时,应用程序就会正确地将我重定向到登录页面以进行身份​​验证。

没有Spring Boot:

我的不带Spring Boot的Spring Security Web应用程序使用以下控制器进行请求映射:

@Controller
@RequestMapping("/")
public class UserController {
    @RequestMapping(value = "login")
    public String login() {
        return "login";
    }
}

安全配置与Spring Boot应用程序的安全配置完全相同,唯一的区别是附加的@EnableWebSecurity批注。

没有Spring Boot的应用程序视图部分的唯一区别是,与Spring Boot一样,我使用JSP代替Thymeleaf:

<form action="/login" method="POST">
    <fieldset>
        <input type="text" name="username" value="" placeholder="Username" />
        <input type="password" name="password" placeholder="Password" />
    </fieldset>
    <input type="submit" id="login" value="Login">
</form>

但是现在当我进入/secure ,我的应用程序错误地为我提供了该页面,而不是重定向到登录页面。 为什么会这样?

答案是,Spring Boot很简单,Spring本身没有那么多。 我的SecurityConfig类未向WAR注册。 因此,为了做到这一点,在与SecurityConfig相同的程序包中,我必须创建3个类。

这个:

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

public class MessageSecurityWebApplicationInitializer
      extends AbstractSecurityWebApplicationInitializer {
}

这个:

@Configuration
@ComponentScan
public class RootConfiguration {
}

和这个:

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { RootConfiguration.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

为什么要这样做,在Spring Guide中有详细说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM