我是Spring安全新手,我在配置弹簧安全性时遵循了这个例子:https://spring.io/blog/2013/07/03/spring-security-java-config-preview-web-security/。所以我看到他们使用这种方法让春天知道配置。
public class SpringWebMvcInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { HelloWebSecurityConfiguration.class };
}
...
}
但我有这样的app初始化:
public class AppInit implements WebApplicationInitializer{
public void onStartup(ServletContext servletContext) throws ServletException {
// TODO Auto-generated method stub
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfiguration.class);
ServletRegistration.Dynamic registration =
servletContext.addServlet("dispatcher", new DispatcherServlet(context));
registration.setLoadOnStartup(1);
registration.addMapping("/services/rest/*");
}
}
我想在那里包含我的spring安全配置,因为没有它我在浏览器中收到消息:你的登录尝试没有成功,请再试一次。
原因:找不到org.springframework.security.authentication.UsernamePasswordAuthenticationToken
的AuthenticationProvider答案 0 :(得分:1)
从AbstractAnnotationConfigDispatcherServletInitializer
扩展是一种使spring加载安全配置的方法,但我不使用它。实现这一目标的更方便的方法可以是这样的(首先在spring security
中依赖pom.xml
的依赖关系):
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.inMemoryAuthentication().withUser("user").password("user").roles("USER")
.and().withUser("admin").password("admin").roles("USER","ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/").hasRole("USER")
.antMatchers("/index").hasRole("USER")
.antMatchers("/message/*").hasRole("USER")
.anyRequest().permitAll()
.and().formLogin().loginPage("/login").defaultSuccessUrl("/index").failureUrl("/login?error").permitAll()
.and().rememberMe().tokenValiditySeconds(60*60*7).key("message")
.and().logout().logoutUrl("/logout").logoutSuccessUrl("/login").permitAll();
// define your action here.
}
}
Spring会在启动时自动加载此配置,这足以使spring security
正常工作。如您所见,您应该在configure(HttpSecurity http)
中定义规则,以告知Spring安全性在请求到来时该怎么做。
答案 1 :(得分:0)
您可以通过更改行
在AppInit类中注册安全配置context.register(AppConfiguration.class);
到
context.register({HelloWebSecurityConfiguration.class, AppConfiguration.class});