您好,登錄后才能下訂單哦!
這篇文章主要講解了“Spring Security核心配置有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring Security核心配置有哪些”吧!
這是Spring Security入門指南中的配置項:
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); }}
當配置了上述的javaconfig之后,我們的應用便具備了如下的功能:
除了“/”,"/home"(首頁),"/login"(登錄),"/logout"(注銷),之外,其他路徑都需要認證。
指定“/login”該路徑為登錄頁面,當未認證的用戶嘗試訪問任何受保護的資源時,都會跳轉到“/login”。
默認指定“/logout”為注銷頁面
配置一個內存中的用戶認證器,使用admin/admin作為用戶名和密碼,具有USER角色
防止CSRF攻擊
Session Fixation protection(可以參考我之前講解Spring Session的文章,防止別人篡改sessionId)
Security Header(添加一系列和Header相關的控制)
HTTP Strict Transport Security for secure requests
集成X-Content-Type-Options
緩存控制
集成X-XSS-Protection
X-Frame-Options integration to help prevent Clickjacking(iframe被默認禁止使用)
為Servlet API集成了如下的幾個方法
HttpServletRequest#getRemoteUser()
HttpServletRequest.html#getUserPrincipal()
HttpServletRequest.html#isUserInRole(java.lang.String)
HttpServletRequest.html#login(java.lang.String, java.lang.String)
HttpServletRequest.html#logout()
我們自己定義的配置類WebSecurityConfig加上了@EnableWebSecurity注解,同時繼承了WebSecurityConfigurerAdapter。你可能會在想誰的作用大一點,毫無疑問@EnableWebSecurity起到決定性的配置作用,它其實是個組合注解。
@Import({ WebSecurityConfiguration.class, // SpringWebMvcImportSelector.class }) // @EnableGlobalAuthentication // @Configurationpublic @interface EnableWebSecurity { boolean debug() default false;}
@Import是springboot提供的用于引入外部的配置的注解,可以理解為:@EnableWebSecurity注解激活了@Import注解中包含的配置類。
@Import(AuthenticationConfiguration.class)@Configurationpublic @interface EnableGlobalAuthentication {}
注意點同樣在@Import之中,它實際上激活了AuthenticationConfiguration這樣的一個配置類,用來配置認證相關的核心類。
也就是說:@EnableWebSecurity完成的工作便是加載了WebSecurityConfiguration,AuthenticationConfiguration這兩個核心配置類,也就此將spring security的職責劃分為了配置安全信息,配置認證信息兩部分。
在這個配置類中,有一個非常重要的Bean被注冊了。
@Configurationpublic class WebSecurityConfiguration { //DEFAULT_FILTER_NAME = "springSecurityFilterChain" @Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) public Filter springSecurityFilterChain() throws Exception { ... } }
在未使用springboot之前,大多數人都應該對“springSecurityFilterChain”這個名詞不會陌生,他是spring security的核心過濾器,是整個認證的入口。在曾經的XML配置中,想要啟用spring security,需要在web.xml中進行如下配置:
springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /*
而在springboot集成之后,這樣的XML被java配置取代。WebSecurityConfiguration中完成了聲明springSecurityFilterChain的作用,并且最終交給DelegatingFilterProxy這個代理類,負責攔截請求(注意DelegatingFilterProxy這個類不是spring security包中的,而是存在于web包中,spring使用了代理模式來實現安全過濾的解耦)。
@Configuration@Import(ObjectPostProcessorConfiguration.class)public class AuthenticationConfiguration { @Bean public AuthenticationManagerBuilder authenticationManagerBuilder( ObjectPostProcessor objectPostProcessor) { return new AuthenticationManagerBuilder(objectPostProcessor); } public AuthenticationManager getAuthenticationManager() throws Exception { ... }}
AuthenticationConfiguration的主要任務,便是負責生成全局的身份認證管理者AuthenticationManager。還記得在《Spring Security(一)--Architecture Overview》中,介紹了Spring Security的認證體系,AuthenticationManager便是最核心的身份認證管理器。
適配器模式在spring中被廣泛的使用,在配置中使用Adapter的好處便是,我們可以選擇性的配置想要修改的那一部分配置,而不用覆蓋其他不相關的配置。WebSecurityConfigurerAdapter中我們可以選擇自己想要修改的內容,來進行重寫,而其提供了三個configure重載方法,是我們主要關心的:
由參數就可以知道,分別是對AuthenticationManagerBuilder,WebSecurity,HttpSecurity進行個性化的配置。
@Configuration@EnableWebSecuritypublic class CustomWebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/resources/**", "/signup", "/about").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") .anyRequest().authenticated() .and() .formLogin() .usernameParameter("username") .passwordParameter("password") .failureForwardUrl("/login?error") .loginPage("/login") .permitAll() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/index") .permitAll() .and() .httpBasic() .disable(); }}
上述是一個使用Java Configuration配置HttpSecurity的典型配置,其中http作為根開始配置,每一個and()對應了一個模塊的配置(等同于xml配置中的結束標簽),并且and()返回了HttpSecurity本身,于是可以連續進行配置。他們配置的含義也非常容易通過變量本身來推測,
authorizeRequests()配置路徑攔截,表明路徑訪問所對應的權限,角色,認證信息。
formLogin()對應表單認證相關的配置
logout()對應了注銷相關的配置
httpBasic()可以配置basic登錄
etc
他們分別代表了http請求相關的安全配置,這些配置項無一例外的返回了Configurer類,而所有的http相關配置可以通過查看HttpSecurity的主要方法得知:
需要對http協議有一定的了解才能完全掌握所有的配置,不過,springboot和spring security的自動配置已經足夠使用了。其中每一項Configurer(e.g.FormLoginConfigurer,CsrfConfigurer)都是HttpConfigurer的細化配置項。
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web .ignoring() .antMatchers("/resources/**"); }}
以筆者的經驗,這個配置中并不會出現太多的配置信息。
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); }}
想要在WebSecurityConfigurerAdapter中進行認證相關的配置,可以使用configure(AuthenticationManagerBuilder auth)暴露一個AuthenticationManager的建造器:AuthenticationManagerBuilder 。如上所示,我們便完成了內存中用戶的配置。
細心的朋友會發現,在前面的文章中我們配置內存中的用戶時,似乎不是這么配置的,而是:
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); }}
如果你的應用只有唯一一個WebSecurityConfigurerAdapter,那么他們之間的差距可以被忽略,從方法名可以看出兩者的區別:使用@Autowired注入的AuthenticationManagerBuilder是全局的身份認證器,作用域可以跨越多個WebSecurityConfigurerAdapter,以及影響到基于Method的安全控制;而 protectedconfigure()
的方式則類似于一個匿名內部類,它的作用域局限于一個WebSecurityConfigurerAdapter內部。
感謝各位的閱讀,以上就是“Spring Security核心配置有哪些”的內容了,經過本文的學習后,相信大家對Spring Security核心配置有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。