Spring Security構建Rest服務-0900-rememberMe記住我

来源:https://www.cnblogs.com/lihaoyang/archive/2018/03/06/8507889.html
-Advertisement-
Play Games

Spring security記住我基本原理: 登錄的時候,請求發送給過濾器UsernamePasswordAuthenticationFilter,當該過濾器認證成功後,會調用RememberMeService,會生成一個token,將token寫入到瀏覽器cookie,同時RememberMeS ...


Spring security記住我基本原理:

登錄的時候,請求發送給過濾器UsernamePasswordAuthenticationFilter,當該過濾器認證成功後,會調用RememberMeService,會生成一個token,將token寫入到瀏覽器cookie,同時RememberMeService裡邊還有個TokenRepository,將token和用戶信息寫入到資料庫中。這樣當用戶再次訪問系統,訪問某一個介面時,會經過一個RememberMeAuthenticationFilter的過濾器,他會讀取cookie中的token,交給RememberService,RememberService會用TokenRepository根據token從資料庫中查是否有記錄,如果有記錄會把用戶名取出來,再調用UserDetailService根據用戶名獲取用戶信息,然後放在SecurityContext里。

 RememberMeAuthenticationFilter在Spring Security中認證過濾器鏈的倒數第二個過濾器位置,當其他認證過濾器都沒法認證成功的時候,就會調用RememberMeAuthenticationFilter嘗試認證。

實現:

 1,登錄表單加上<input type="checkbox" name="remember-me" value="true"/>,SpringSecurity在SpringSessionRememberMeServices類里定義了一個常量,預設值就是remember-me

 2,根據上邊的原理圖可知,要配置TokenRepository,把生成的token存進資料庫,這是一個配置bean的配置,放在了BrowserSecurityConfig里

3,在configure里配置

4,在BrowserProperties裡加上自動登錄時間,把記住我時間做成可配置的

//記住我秒數配置
private int rememberMeSeconds = 10;齊活

package com.imooc.security.browser;

@Configuration //這是一個配置
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter{
    
    //讀取用戶配置的登錄頁配置
    @Autowired
    private SecurityProperties securityProperties;
    
    //自定義的登錄成功後的處理器
    @Autowired
    private AuthenticationSuccessHandler imoocAuthenticationSuccessHandler;
    
    //自定義的認證失敗後的處理器
    @Autowired
    private AuthenticationFailureHandler imoocAuthenticationFailureHandler;
    
    //數據源
    @Autowired
    private DataSource dataSource;
    
    
    @Autowired
    private UserDetailsService userDetailsService;

    //註意是org.springframework.security.crypto.password.PasswordEncoder
    @Bean
    public PasswordEncoder passwordencoder(){
        //BCryptPasswordEncoder implements PasswordEncoder
        return new BCryptPasswordEncoder();
    }
    
    
    /**
     * 記住我TokenRepository配置,在登錄成功後執行
     * 登錄成功後往資料庫存token的
     * @Description: 記住我TokenRepository配置
     * @param @return   JdbcTokenRepositoryImpl
     * @return PersistentTokenRepository  
     * @throws
     * @author lihaoyang
     * @date 2018年3月5日
     */
    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
        jdbcTokenRepository.setDataSource(dataSource);
        //啟動時自動生成相應表,可以在JdbcTokenRepositoryImpl里自己執行CREATE_TABLE_SQL腳本生成表
        jdbcTokenRepository.setCreateTableOnStartup(true);
        return jdbcTokenRepository;
    }
    
    
   //版本二:可配置的登錄頁
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //驗證碼過濾器
        ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
        //驗證碼過濾器中使用自己的錯誤處理
        validateCodeFilter.setAuthenticationFailureHandler(imoocAuthenticationFailureHandler);
        //配置的驗證碼過濾url
        validateCodeFilter.setSecurityProperties(securityProperties);
        validateCodeFilter.afterPropertiesSet();
        
        
        //實現需要認證的介面跳轉表單登錄,安全=認證+授權
        //http.httpBasic() //這個就是預設的彈框認證
        //
        http //把驗證碼過濾器載入登錄過濾器前邊
            .addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
            //表單認證相關配置
            .formLogin() 
                .loginPage("/authentication/require") //處理用戶認證BrowserSecurityController
                //登錄過濾器UsernamePasswordAuthenticationFilter預設登錄的url是"/login",在這能改
                .loginProcessingUrl("/authentication/form") 
                .successHandler(imoocAuthenticationSuccessHandler)//自定義的認證後處理器
                .failureHandler(imoocAuthenticationFailureHandler) //登錄失敗後的處理
            .and()
            //記住我相關配置    
            .rememberMe()
                .tokenRepository(persistentTokenRepository())//TokenRepository,登錄成功後往資料庫存token的
                .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSeconds())//記住我秒數
                .userDetailsService(userDetailsService) //記住我成功後,調用userDetailsService查詢用戶信息
            .and()
            //授權相關的配置 
            .authorizeRequests() 
                // /authentication/require:處理登錄,securityProperties.getBrowser().getLoginPage():用戶配置的登錄頁
                .antMatchers("/authentication/require",
                securityProperties.getBrowser().getLoginPage(),//放過登錄頁不過濾,否則報錯
                "/verifycode/image").permitAll() //驗證碼
                .anyRequest()        //任何請求
                .authenticated()    //都需要身份認證
            .and()
                .csrf().disable() //關閉csrf防護
            ;    
    }
}

其中由於要和資料庫打交道,所以需要註入一個數據源:application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/imooc-demo
spring.datasource.username=root
spring.datasource.password=root

啟動應用,訪問 localhost:8080/user,需要登錄

登錄成功:

資料庫:生成一個persistent_logins表,存進去了一條數據

停止服務,從新啟動(註釋掉生成保存token表的jdbcTokenRepository.setCreateTableOnStartup(true);)因為我們的用戶登錄信息都存在了session中,所以重啟服務後,再訪問localhost:8080/user,本應該重新引導到登錄頁,但是由於配置了記住我,所以能夠直接訪問,拿到了介面數據

請求頭:

至此基本的rememberMe已做好

 

 

完整代碼放在了github:https://github.com/lhy1234/spring-security

 

打個廣告

最近在玩今日頭條頭條號,錄一些北京打工生活,想看的請搜索“北漂小陽”點擊關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ES6學習筆記(1)參考書《ECMAScript 6入門》http://es6.ruanyifeng.com/let和const命令let 總結1.聲明變數基本使用方法與var 相同 不同點 a.在代碼塊中使用let聲明的變數只在代碼塊中有效,代碼塊外無法訪問,而用var聲明的在代碼塊外也可以訪問。 ...
  • 使用例子: 添加: 在window.location.href後加上a=1和b=2。 修改之後將會變成xxxxxxxxxx?a=1&b=2。 獲取參數: ...
  • 原因是mui框架的有個css樣式 *{ -webkit-user-select: none; } *{ -webkit-user-select: none; } 其作用是禁掉用戶可以選中頁面中的內容。 添加以下style樣式即可 input{ -webkit-user-select: auto; } ...
  • 問題 後圖省事使用 來添加native配置,結果run時報錯。 ps:安裝的 需要native的插件 不變且多次link會一直給幾個配置文件里添加代碼,會出現多餘代碼,所以link一次就好 解決 原因是link配置不完全, 文件少了一行配置: link可能會有問題,最穩健的還是插件文檔中提到的手動方 ...
  • 所謂“條條道路通羅馬”,在現實中,為達到某種目的往往不是只有一種方法。比如掙錢養家:可以做點小生意,可以打分工,甚至還可以是偷、搶、賭等等各種手段。在程式語言設計中,也會遇到這種類似的情況,要實現某種功能可以有多種方案選擇。比如,在很多地圖類軟體上,你想從A地點到達B地點時,為你提供幾種交通工具的選... ...
  • 通過統計資料庫中的1000多個項目,我們發現在 JavaScript 中最常出現的錯誤有10個。本文會向大家介紹這些錯誤發生的原因以及如何防止。 ...
  • 近來區塊鏈一詞很熱門,網路上關乎其討論也很多,這裡就不解釋了,畢竟幾句話也是說不清楚的。 最近得空利用HTML5+css3+jQ開發了一個移動端的區塊鏈項目,感覺界面、佈局、效果還是ok的。 項目效果截圖: 對於區塊鏈,這裡有詳細解釋: https://www.zhihu.com/question/ ...
  • git進行管理時,.gitignore是必不可少的,可以指定不需要提交到倉庫的資源。最好在git init之後就創建 .gitignore文件,這是個好習慣,常用的配置及說明如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...