這篇文章主要講解了“Spring Security核心配置有哪些”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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”該路徑為登錄頁面,當未認證的用戶嘗試訪問任何受保護的資源時,都會跳轉(zhuǎn)到“/login”。
默認指定“/logout”為注銷頁面
配置一個內(nèi)存中的用戶認證器,使用admin/admin作為用戶名和密碼,具有USER角色
防止CSRF攻擊
Session Fixation protection(可以參考我之前講解Spring Session的文章,防止別人篡改sessionId)
Security Header(添加一系列和Header相關(guān)的控制)
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起到?jīng)Q定性的配置作用,它其實是個組合注解。
@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這樣的一個配置類,用來配置認證相關(guān)的核心類。
也就是說:@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之前,大多數(shù)人都應該對“springSecurityFilterChain”這個名詞不會陌生,他是spring security的核心過濾器,是整個認證的入口。在曾經(jīng)的XML配置中,想要啟用spring security,需要在web.xml中進行如下配置:
springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /*
而在springboot集成之后,這樣的XML被java配置取代。WebSecurityConfiguration中完成了聲明springSecurityFilterChain的作用,并且最終交給DelegatingFilterProxy這個代理類,負責攔截請求(注意DelegatingFilterProxy這個類不是spring security包中的,而是存在于web包中,spring使用了代理模式來實現(xiàn)安全過濾的解耦)。
@Configuration@Import(ObjectPostProcessorConfiguration.class)public class AuthenticationConfiguration { @Bean public AuthenticationManagerBuilder authenticationManagerBuilder( ObjectPostProcessor objectPostProcessor) { return new AuthenticationManagerBuilder(objectPostProcessor); } public AuthenticationManager getAuthenticationManager() throws Exception { ... }}
AuthenticationConfiguration的主要任務(wù),便是負責生成全局的身份認證管理者AuthenticationManager。還記得在《Spring Security(一)--Architecture Overview》中,介紹了Spring Security的認證體系,AuthenticationManager便是最核心的身份認證管理器。
適配器模式在spring中被廣泛的使用,在配置中使用Adapter的好處便是,我們可以選擇性的配置想要修改的那一部分配置,而不用覆蓋其他不相關(guān)的配置。WebSecurityConfigurerAdapter中我們可以選擇自己想要修改的內(nèi)容,來進行重寫,而其提供了三個configure重載方法,是我們主要關(guān)心的:
由參數(shù)就可以知道,分別是對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配置中的結(jié)束標簽),并且and()返回了HttpSecurity本身,于是可以連續(xù)進行配置。他們配置的含義也非常容易通過變量本身來推測,
authorizeRequests()配置路徑攔截,表明路徑訪問所對應的權(quán)限,角色,認證信息。
formLogin()對應表單認證相關(guān)的配置
logout()對應了注銷相關(guān)的配置
httpBasic()可以配置basic登錄
etc
他們分別代表了http請求相關(guān)的安全配置,這些配置項無一例外的返回了Configurer類,而所有的http相關(guān)配置可以通過查看HttpSecurity的主要方法得知:
需要對http協(xié)議有一定的了解才能完全掌握所有的配置,不過,springboot和spring security的自動配置已經(jīng)足夠使用了。其中每一項Configurer(e.g.FormLoginConfigurer,CsrfConfigurer)都是HttpConfigurer的細化配置項。
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web .ignoring() .antMatchers("/resources/**"); }}
以筆者的經(jīng)驗,這個配置中并不會出現(xiàn)太多的配置信息。
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); }}
想要在WebSecurityConfigurerAdapter中進行認證相關(guān)的配置,可以使用configure(AuthenticationManagerBuilder auth)暴露一個AuthenticationManager的建造器:AuthenticationManagerBuilder 。如上所示,我們便完成了內(nèi)存中用戶的配置。
細心的朋友會發(fā)現(xiàn),在前面的文章中我們配置內(nèi)存中的用戶時,似乎不是這么配置的,而是:
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); }}
如果你的應用只有唯一一個WebSecurityConfigurerAdapter,那么他們之間的差距可以被忽略,從方法名可以看出兩者的區(qū)別:使用@Autowired注入的AuthenticationManagerBuilder是全局的身份認證器,作用域可以跨越多個WebSecurityConfigurerAdapter,以及影響到基于Method的安全控制;而 protectedconfigure()
的方式則類似于一個匿名內(nèi)部類,它的作用域局限于一個WebSecurityConfigurerAdapter內(nèi)部。
感謝各位的閱讀,以上就是“Spring Security核心配置有哪些”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Spring Security核心配置有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)頁標題:SpringSecurity核心配置有哪些-創(chuàng)新互聯(lián)
URL標題:http://jinyejixie.com/article2/dcgcic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、微信公眾號、服務(wù)器托管、網(wǎng)站改版、網(wǎng)站內(nèi)鏈、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容