spring boot層層filter, 安全控制設定為一個被稱為springSecurityFilterChain
的Servlet filter,使用@EnableWebSecurity anonotation
REF:
前三步基本組成了權限驗證的程序,而 Spring Security 大概是這樣做的:
資訊裝箱: 取得 username 及 password 並放入 UsernamePasswordAuthenticationToken(實作了Authentication介面) 的實例中
箱子送驗證: 該 token 被傳遞給 AuthenticationManager 的實例作驗證 validation,若驗證成功,AuthenticationManager 會回傳一個裝著該使用者 context 資訊的 Authentication 實例
建立驗證成功的context: Spring Security 容器呼叫SecurityContextHolder.getContext().setAuthentication() 方法,並將剛得到的 Authentication 物件當參數傳入,以建立 security context
從這之後,該使用者就會被視為通過驗證,只有 SecurityContextHolder 能取得裝著使用者完整 context 資訊的 Authentication
Q: 如何避免session遺失,後端的Pod有多個的時候,就會遇到session在request導到不同Pods時候,Session遺失的問題
A:
Q: 什麼是X509Certificate
A: 用於標準格式的公鑰證書
Q: 配置configure時, WebSecurity和HttpSecurity的差別?
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{…}
A: WebSecurity是global的filter設定, HttpSecurity則是單一filter設定,詳細如下:
HttpSecurity用來建置SecurityFilterChain
,一個程式可以有多個SecurityFilterChain,因此需要有一個中介者FilterChainProxy
來管理這些SecurityFilterChain;WebSecurity
則是用來建置FilterChainProxy
,額外還有清理SecurityContext以避免memory leak, 定義防火牆, 啟用Spring security的debug mode等。最後再由FilterChainProxy結合Spring的bridge proxy DelegatingFilterProxy
,將此些security的filter融入程式
Q: 在使用filter或AOP時,從HttpServletRequest輸入流讀取InputStream(確切來說是ServletInputStream, 繼承者),後續將無法再獲得請求內容
A: HttpServletRequest只能讀取一次,讀取InputStream時有pointer指示位置,讀取完畢則回傳-1,若要重讀則需呼叫InputStream.reset(),能否reset(),取決markSupport方法,而ServletInputStream沒有override此些方法,InputStream也不實現reset()
HttpServletRequestWrapper
,再往後傳即可解決Q: 自定義filter後,請求不會自己傳到後續的filter
A: 若filter要使請求繼續處理,一定要調用filterChain.doFilter()
Q: 什麼是Servlet(Server Applet)
A: 基於協議requesr, response service的java class, 在java EE是Servlet規範, aka java實現的介面, servlet廣義來講是指直線了這個servlet介面的java class; servlet的容器收到http請求後,將request封裝成一個servletRequest,並加封裝一個servletResponse,呼叫servlet應用的service方法,將servletRequest及servletResponse傳入,方法執行後將servlet將servletResponse回應給broswer
Q: Interceptor和Filter的差別
A:
filter | interceptor | description | |
---|---|---|---|
定義位置 | java.servlet | handlerInterceptor定義在org.springframework.web.servlet | 分別在servlet類別, 及spring框架中定義 |
配置 | web.yml | - | - |
作用 | servlet前後作用, 不考慮servlet實現 | 方法, exception前後, 更靈活解耦合 | spring框架可以優先選用interceptor |
範圍 | servlet規定 | web app, application及swing皆可用 | |
規範 | servlet規定 | 存在spring容器, 由spring框架支持 | |
與spring關係 | 不可使用容器內資源 | 屬於spring組件, 可以使用spring內的任何資源,透過IOC注入到interceptor即可 | |
調用方 | 被server(e.g. tomcat)所使用 | spring調用 | filter早於interceptor執行 |
實現 | 函數回調 | 基於java反射及動態代理機制 | |
觸發時機 | 請求進入容器後, 請求進入servlet之前, 返回亦然 |
request -> filter > servlet > interceptor > controller
controller > interceptor > servlet > filter ->response
For SameSiteCookies.NONE be aware, that cookies are also Secure (SSL used), otherwise they couldn't be applied.
By default since Chrome 80 cookies considered as SameSite=Lax!