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
,僅允許角色為USER
、ADMIN
、TEST
的使用者訪問,這個是但個資源設定訪問許可權;
第二行指定的是/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
第七行設定的是預設登入成功頁,和第五行設定的一樣,這個設定也會和處理器衝突,區別是第五行的設定會跳轉到新的頁面,位址列會發生改變,第七行的設定會返回一個新的頁面替換當前頁面的內容,但是位址列不會發生變化,就像forward
和sendRedirect
的區別。
第八行設定失敗跳轉頁面,這裡和第五行類似,不過是跳轉失敗頁;
最後一個設定的是失敗處理器,這裡我們可以設定的自己的處理器,讓他返回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
,好了,今天就先到這裡吧!