spring security 6:放行某些請求-接口

spring boot 3.1.10

spring-boot-starter-security 3.1.10

spring security web 6.1.8

--

ben發佈於博客園

序章

自定義了 Bean SecurityFilterChain,在 http.authorizeHttpRequests 中放行了 接口“/system/register”,還定義了 session管理 的 invalidSessionStrategy。

@Bean

public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/system/register").permitAll()
.anyRequest().authenticated()
)
.sessionManagement(sm -> sm
.invalidSessionStrategy(new AppInvalidSessionStrategy())
)

)

return http.build();

}

可是,遇到了問題:訪問 /system/register 時,提示 “無效憑證”——由 invalidSessionStrategy 觸發

無效憑證的原因 是 請求自帶了 Cookie JSESSIONID,觸發了 SESSION 驗證機制,驗證無效,由 自定義的  invalidSessionStrategy 處理——返回錯誤信息。

期望:接口 /system/register 無需驗證、授權即可訪問。

 

解決方案1:添加Bean WebSecurityCustomizer

根據 參考資料#1 的介紹,添加了一個 Bean WebSecurityCustomizer,解決了問題。

@Bean
public WebSecurityCustomizer ignoringCustomizer() {
    // 忽略註冊接口
    return (web) -> web.ignoring()
        .requestMatchers("/system/register");
}

更多介紹,請查看 參考資料#1。

ben發佈於博客園

解決方案2:添加 空Filter列表 的 Bean SecurityFilterChain(推薦)

根據 官網文檔:

Spring Security > Servlet Applications > Architecture(https://docs.spring.io/spring-security/reference/servlet/architecture.html) 的介紹,

可以 添加多個 SecurityFilterChain 實例(multiple SecurityFilterChain instances),各個實例 處理 不同的請求

官方圖官方圖-multi-securityfilterchain.png

在官文 中有這樣一句話:

It is important to note that each SecurityFilterChain can be unique and can be configured in isolation.

In fact, a SecurityFilterChain might have zero security Filter instances if the application wants Spring Security to ignore certain requests.

翻譯(金山詞霸):

需要注意的是,每個安全過濾器鏈都可以是 唯一的,並且可以 進行 隔離配置。

實際上,如果應用程序 希望Spring安全程序 忽略 某些請求,那麼 安全過濾器鏈 可能 沒有任何安全過濾器實例

這不正是自己想要的嗎——忽略某些請求(/system/register)?

鼓搗了好一會兒,最終,直接 添加一個 空Filter列表 的 Bean SecurityFilterChain 從而實現了需求。

@Bean
public SecurityFilterChain securityFilterChainEmpty() {

    return new SecurityFilterChain() {
        private RequestMatcher requestMatcher = request -> request
            .getRequestURI().startsWith("/system/register");
        @Override
        public boolean matches(HttpServletRequest request) {
            return requestMatcher.matches(request);
        }

        @Override
        public List<Filter> getFilters() {
            return new ArrayList<>();
        }
    };
}

ben發佈於博客園

小結

推薦使用 解決方案#2。

沒事多看看 官方文檔。

 

---END---

ben發佈於博客園

本文鏈接:

https://www.cnblogs.com/luo630/p/18125429

ben發佈於博客園

參考資料

1、SpringSecurity6解決requestMatchers().permitAll()後依然執行自定義過濾器的問題

喫青椒的秋草鸚鵡
已於 2023-06-04 22:02:31 修改
https://blog.csdn.net/m0_54250110/article/details/131037578

2、

 

ben發佈於博客園

ben發佈於博客園

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章