spring boot 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發佈於博客園