工作的 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 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] 删除。
我来说两句