springSecurity總結

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

@Configuration寫在類上,說明這是一個配置文件,而後用@Bean來聲明方法。方法通常返回的都是類的實例。意思是至關於xml文件中聲明的bean。

@EnableGlobalMethodSecurity

Spring Security默認是禁用註解的,要想開啓註解,須要在繼承WebSecurityConfigurerAdapter的類上加@EnableGlobalMethodSecurity註解

@EnableGlobalMethodSecurity(securedEnabled=true) 開啓@Secured 註解過濾權限
@EnableGlobalMethodSecurity(jsr250Enabled=true)開啓@RolesAllowed 註解過濾權限 
@EnableGlobalMethodSecurity(prePostEnabled=true) 使用表達式時間方法級別的安全性         
4個註解可用: @PreAuthorize 在方法調用以前,基於表達式的計算結果來限制對方法的訪問 @PostAuthorize 容許方法調用,可是若是表達式計算結果爲false,將拋出一個安全性異常 @PostFilter 容許方法調用,但必須按照表達式來過濾方法的結果 @PreFilter 容許方法調用,但必須在進入方法以前過濾輸入值

 

2:認證相關的類和接口:

UserDetailsService(接口):

接口裏的惟一一個方法,接收String類型的用戶名參數,經過當前登陸進來的用戶查詢用戶信息,返回UserDetails(接口)

 

UserDetails(接口)

Spring Security的核心接口,它表明一個主體,是擴展的,也是Security認證須要提供的類, 一般UserDetails轉換成你係統提供的類

 

SecurityContextHolder

咱們經過下面這種方法來獲取當前用戶信息:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (principal instanceof UserDetails) { String username = ((UserDetails)principal).getUsername(); } else { String username = principal.toString(); }

Authentication

Authentication是一個接口,用來表示用戶認證信息的,在用戶登陸認證以前相關信息會封裝爲一個Authentication具體實現類的對象,在登陸認證成功以後又會生成一個信息更全面,包含用戶權限等信息的Authentication對象,而後把它保存在SecurityContextHolder所持有的SecurityContext中,供後續的程序進行調用,如訪問權限的鑑定等。

 

 

PasswordEncoder(接口)
springSecurity提供的密碼加密、密碼匹配(比對)接口,
BCryptPasswordEncoder實現此接口,所以能夠直接調用BCryptPasswordEncoder 的encode方法加密,
固然也可使用springSecurity提供的
Md5PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder(); 類進行加密
 
相關文章
相關標籤/搜索