2017-07-19 89 views
0

我是彈簧安全新手,我在配置彈簧安全性方面遵循此示例:https://spring.io/blog/2013/07/03/spring-security-java-config-preview-web-security/。所以我看到他們使用這種方法讓彈簧知道配置。如何將Spring Security配置「包含」到應用程序中

public class SpringWebMvcInitializer extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 

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

但我的應用程序的初始化是這樣的:

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/*"); 

    } 

} 

而且我想包括我的春季安全配置還有,因爲沒有它,我在瀏覽器中得到消息:您的登錄嘗試不成功,嘗試再次。

原因:沒有的AuthenticationProvider發現org.springframework.security.authentication.UsernamePasswordAuthenticationToken

+1

關於Spring Security:請參閱[我的問題和答案](https://stackoverflow.com/questions/44977972/how-to-enable-bearer-authentication-on-spring-beoot-application/44978587#44978587);它演示了使用承載令牌和資源服務器的OAuth2身份驗證的工作實現。我沒有包含build.gradle,也沒有包含SQL模式和數據集。但希望你會發現該代碼是一個有用的參考/起點。 – Birchlabs

回答

0

您可以通過更改線路剛剛註冊您的安全配置在您的AppInit類

context.register(AppConfiguration.class); 

context.register({HelloWebSecurityConfiguration.class, AppConfiguration.class}); 
+0

那麼,這並沒有解決我的認證和授權問題,但我想這就是我所要求的。 – wdc

1

AbstractAnnotationConfigDispatcherServletInitializer延伸是一種使spring能夠加載安全配置的方法,但我不使用它。要做到這一點,可就是這樣(decalare在pom.xml第一的spring security的依賴)更加方便易方式:

@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)中定義規則來告訴春季安全當請求到來時該做什麼。

相關問題