如何将Spring Security配置“包含”到应用程序中

时间:2017-07-19 08:46:27

标签: java spring spring-mvc spring-security

我是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

2 个答案:

答案 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});