項目場景:在使用Spring security做用戶認證從SecurityContextHolder中獲取用戶信息時,遇見如下問題:
分析原因:獲取不到登錄時儲存的用戶信息,猜測可能是在執行完某些操作之后將用戶信息替換或者直接清空了。查看SecurityContextHolder的api發現里面有個clearContext()方法,通過debug模式發現當執行完org.springframework.security.web.context.SecurityContextPersistenceFilter和org.springframework.security.web.FilterChainProxy過濾器時會調用SecurityContextHolder.clearContext()方法把SecurityContextHolder清空,所以獲取不到存儲的用戶信息。
解決方案:找到了問題所在就好解決了,可以自定義過濾器重新保存用戶認證信息,如代碼中自定義的MyAuthenticationTokenGenericFilter
改進之后的結果如下:
需要注意的是,如果需要用到權限認證,還需保存用戶的權限信息,我這里暫時不用,所以沒保留,只需要替換成這個構造函數就可以new UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities)