与 spring boot 和类似配置相比,没有 spring boot 的 Spring 安全身份验证不起作用

广东省

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

每当我转到保留的/secureURL 时,应用程序都会正确地将我重定向到登录页面进行身份验证。

没有 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 的情况下,我的应用程序的视图部分的唯一区别是我使用 JSP 而不是像 Spring Boot 那样的 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中详细解释了为什么我应该这样做

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章