springSecurity總結:spring
1、Spring security框架簡介數據庫
一、簡介
一個可以爲基於Spring的企業應用系統提供聲明式的安全訪問控制解決方式的安全框架(簡單說是對訪問權限進行控制嘛),應用的安全性包括用戶認證(Authentication)和用戶受權(Authorization)兩個部分。用戶認證指的是驗證某個用戶是否爲系統中的合法主體,也就是說用戶可否訪問該系統。用戶認證通常要求用戶提供用戶名和密碼。系統經過校驗用戶名和密碼來完成認證過程。用戶受權指的是驗證某個用戶是否有權限執行某個操做。在一個系統中,不一樣用戶所具備的權限是不一樣的。好比對一個文件來講,有的用戶只能進行讀取,而有的用戶能夠進行修改。通常來講,系統會爲不一樣的用戶分配不一樣的角色,而每一個角色則對應一系列的權限。 spring security的主要核心功能爲 認證和受權,全部的架構也是基於這兩個核心功能去實現的。緩存
二、框架原理
衆所周知 想要對對Web資源進行保護,最好的辦法莫過於Filter,要想對方法調用進行保護,最好的辦法莫過於AOP。因此springSecurity在咱們進行用戶認證以及授予權限的時候,經過各類各樣的攔截器來控制權限的訪問,從而實現安全。安全
以下爲其主要過濾器 :架構
WebAsyncManagerIntegrationFilter : 將 Security 上下文與 Spring Web 中用於處理異步請求映射的 WebAsyncManager 進行集成。框架
SecurityContextPersistenceFilter異步
HeaderWriterFilter ide
CorsFilter
LogoutFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
UsernamePasswordAuthenticationFilter
BasicAuthenticationFilter源碼分析
三、框架的核心組件:加密
SecurityContextHolder:提供對SecurityContext的訪問
SecurityContext,:持有Authentication對象和其餘可能須要的信息
AuthenticationManager 其中能夠包含多個AuthenticationProvider
ProviderManager對象爲AuthenticationManager接口的實現類
AuthenticationProvider 主要用來進行認證操做的類 調用其中的authenticate()方法去進行認證操做
Authentication:Spring Security方式的認證主體
GrantedAuthority:對認證主題的應用層面的受權,含當前用戶的權限信息,一般使用角色表示
UserDetails:構建Authentication對象必須的信息,能夠自定義,可能須要訪問DB獲得
UserDetailsService:經過username構建UserDetails對象,經過loadUserByUsername根據userName獲取UserDetail對象 (能夠在這裏基於自身業務進行自定義的實現 如經過數據庫,xml,緩存獲取等)
四、springSecurity工做原理:
這篇博客已經講得很是細了: http://www.javashuo.com/article/p-tgsvcawe-ek.html
源碼分析認證流程:https://blog.csdn.net/lizc_lizc/article/details/84061657
2、動手實現
一、實現以前咱們先了解一下springSecurity 的幾個相關注解:
@Configuration寫在類上,說明這是一個配置文件,而後用@Bean來聲明方法。方法通常返回的都是類的實例。意思是至關於xml文件中聲明的bean。
Spring Security默認是禁用註解的,要想開啓註解,須要在繼承WebSecurityConfigurerAdapter的類上加@EnableGlobalMethodSecurity註解
@EnableGlobalMethodSecurity(securedEnabled=true) 開啓@Secured 註解過濾權限
@EnableGlobalMethodSecurity(jsr250Enabled=true)開啓@RolesAllowed 註解過濾權限
@EnableGlobalMethodSecurity(prePostEnabled=true) 使用表達式時間方法級別的安全性
4個註解可用: @PreAuthorize 在方法調用以前,基於表達式的計算結果來限制對方法的訪問 @PostAuthorize 容許方法調用,可是若是表達式計算結果爲false,將拋出一個安全性異常 @PostFilter 容許方法調用,但必須按照表達式來過濾方法的結果 @PreFilter 容許方法調用,但必須在進入方法以前過濾輸入值
2:認證相關的類和接口:
接口裏的惟一一個方法,接收String類型的用戶名參數,經過當前登陸進來的用戶查詢用戶信息,返回UserDetails(接口)
Spring Security的核心接口,它表明一個主體,是擴展的,也是Security認證須要提供的類, 一般UserDetails轉換成你係統提供的類
咱們經過下面這種方法來獲取當前用戶信息:
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (principal instanceof UserDetails) { String username = ((UserDetails)principal).getUsername(); } else { String username = principal.toString(); }
Authentication是一個接口,用來表示用戶認證信息的,在用戶登陸認證以前相關信息會封裝爲一個Authentication具體實現類的對象,在登陸認證成功以後又會生成一個信息更全面,包含用戶權限等信息的Authentication對象,而後把它保存在SecurityContextHolder所持有的SecurityContext中,供後續的程序進行調用,如訪問權限的鑑定等。
PasswordEncoder(接口)
springSecurity提供的密碼加密、密碼匹配(比對)接口,BCryptPasswordEncoder實現此接口,所以能夠直接調用BCryptPasswordEncoder 的encode方法加密,
固然也可使用springSecurity提供的Md5PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder(); 類進行加密