1. 程式人生 > 其它 >spring-boot啟用security元件 · 下

spring-boot啟用security元件 · 下

前言

經過昨天和前天的分享,我們對security有了一些基本的認識,同時也可以基於它做一些簡單的應用,但是學習知識不能一知半解,這樣即不方便應用,也不方便我們對知識的整體理解和掌握,所以為了能夠對security有更深入的瞭解和認識,我們今天還是繼續瞭解sercurity元件。

今天的內容主要是對HttpSecurity的配置做一些補充說明,為我們明天做完整demo做準備,好了,下面我們直接開始吧。

自定義登入

今天我們主要分享自定義登入相關內容。

修改配置

首先我們要修改配置類,我們先說configure(HttpSecurity http)方法:

下面我們分塊講解,先說資源許可權配置。

資源許可權配置

這一塊昨天其實也說過了,但是涉及的規則比較多,所以還是要多試多實踐

http.authorizeRequests()
            // 限定 ” /user/welcome ”請求賦予角色 ROLE_USER 或者 ROLE_ADMIN
            .antMatchers("/welcome").hasAnyRole("USER", "ADMIN", "TEST")
            // 限定 ” /admin/ ”下所有請求許可權賦予角色 ROLE_ADMIN
            .antMatchers("/admin/**").hasAnyAuthority("ROLE_ADMIN")
            .antMatchers("/test/**").hasAnyAuthority("ROLE_TEST", "ROLE_ADMIN")
            .antMatchers("/user/**").hasAnyAuthority("ROLE_USER", "ROLE_ADMIN")
            // 其他路徑允許簽名後訪問
            .anyRequest().permitAll()
            // 對於沒有配置許可權的其他請求允許匿名訪問
            .and().anonymous()

先解釋下上面的許可權配置,第一行配置的/welcome,僅允許角色為USERADMINTEST的使用者訪問,這個是但個資源設定訪問許可權;

第二行指定的是/admin/**,僅允許擁有管理許可權的使用者訪問,因為是萬用字元,所以admin/路徑下的所有資源都可以訪問;

第三行和第四行的配置和第二行差不多,不過訪問許可權指定的是多許可權,只要具備其中一個許可權即可訪問;

第五行和第六行是設定其他未設定許可權的資源訪問許可權,一般只指定一種即可。關於兩者的區別,網上有種說法是,匿名資源只允許不登入的使用者訪問,已登入的使用者無法訪問,而permitAll沒有這種限制,但是我實際測試發現,兩者沒有本質區別,等後續深入瞭解之後再來探討吧,有小夥伴清楚的,也可以留言,讓我們都知道下。

登入頁面設定

這裡主要是設定登入相關的處理介面和頁面,通過這裡的配置,我們可以用自己的介面替換security元件的預設配置,實現更靈活的鑑權設定。

// 使用spring security 預設的登入頁面
			// 設定登入相關頁面
            .and().formLogin()
            // 登入頁
            .loginPage("/userLogin")
            // 登入處理介面
            .loginProcessingUrl("/loginService")
             // 登入成跳轉理頁面
            .successForwardUrl("/user/welcome")
             // 登入成功處理器
            .successHandler(successHandler)
            // 預設成功頁面
            .defaultSuccessUrl("/welcome")
            // 失敗跳轉頁面
            .failureForwardUrl("/fail")           
            // 失敗處理器
            .failureHandler(handler)

這裡,我們簡單解釋下,第三行設定的是登入頁面,也就是我們前天分享內容中的登入頁:

第四行設定的是登入處理介面,這裡必須是post介面,如果是get介面登入的時候,返回是有問題的:

經過我的實測,發現前端請求的時候必須是post(不論後端是post還是get,這也說明在spring-boot中,get介面是支援post方式請求,但是反過來不行),如果是get請求,就是上面的錯誤。

第五行設定的是登入成功後的頁面;

第六行設定的是登入成功處理器,這個和第五行的頁面是衝突的,但是後面的配置會覆蓋前面的設定(誰在後面就會覆蓋前面的設定),這裡我們可以根據自己的需要設定返回值的型別,比如json

第七行設定的是預設登入成功頁,和第五行設定的一樣,這個設定也會和處理器衝突,區別是第五行的設定會跳轉到新的頁面,位址列會發生改變,第七行的設定會返回一個新的頁面替換當前頁面的內容,但是位址列不會發生變化,就像forwardsendRedirect的區別。

第八行設定失敗跳轉頁面,這裡和第五行類似,不過是跳轉失敗頁;

最後一個設定的是失敗處理器,這裡我們可以設定的自己的處理器,讓他返回json

其他配置

這裡主要講兩個設定,一個就是使用者的remeberMe設定,和跨域攻擊驗證設定。

 // 記住我,token過期時間,使用者cookie名
            .and().rememberMe().tokenValiditySeconds(30).key("remember-me")
            // 啟動 HTTP 基礎驗證
            .and().httpBasic().and()
            // 禁用跨域csrf驗證
            .csrf().disable();

remeberMe設定的是使用者的cookie資訊,tokenValiditySeconds設定的token過期時間,key設定的是cookie的名字。但是這裡設定了,好像沒啥用,應該是我開啟方式不對,後面再研究下。

最後一行設定的是禁用csrf校驗,如果你的介面有跨域登入的錯誤的話,解決方法就是禁用跨域校驗。

總結

今天主要是一些補充內容,相比昨天會更細緻,內容也更豐富,但是還有一些內容還沒分享,比如登入成功處理器、登入失敗處理器、登入認證處理器等,這些內容我打算明天放到具體例項中分享,所以明天的內容也很多,明天我會分享一個security的例項,實現完整的登入鑑權等操作,讓大家可以更直觀地認識security,好了,今天就先到這裡吧!