既然大家都使用spring,作爲一個javaer必須是spring程序員。我不是很喜歡spring-security的那一套,
但是仔細看過它的代碼之後感覺雖然寫的不怎麼樣,但是很全,實現的比較完整,所以試了一下整合oauth2.0.
oauth2第三方登錄的時候非常好,權限控制非常到位,如果不清楚oauth2的可以花一分鐘看看這篇,寫的很詳細http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html。oauth2 也比較普遍,值得花時間搞清楚裏面的每一個細節和每個概念。
oauth授權之前有兩個概念要清楚,第一個是授權服務器,第二是資源服務器。授權服務器是專門用來生成token,驗證token,以及刷新token的。
而資源服務器只是校驗訪問連接是否帶上了token,以及該token是否有權限訪問該資源。在Spring 裏面要配置資源服務是使用的
org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer
這個類有很多屬性,
authenticationManager 是授權的管理器
在獲取授權對象的時候會調用AuthenticationManager.authenticate方法獲取auth對象。具體的在 OAuth2AuthenticationProcessingFilter 這個請求處理請求的時候獲取。
tokenStore 是指定一共token存儲
默認是 InMemoryTokenStore,也就是在內存中,AuthenticationManager是在tokenStore裏面獲取,可以指定jdbc/redis,也可以自定義。
resourceId 是指定這個資源服務器的資源id
在校驗token的時候,如果發現授權的token不具備訪問這個資源id的權限就可以直接拒絕掉。
還要一些其他屬性。主要重要的就如上幾個,資源服務也可以控制到具體請求路徑的權限,因爲資源服務器的配置也會有一個HttpSecurity.如下代碼
@Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().hasRole("USER"); }
就是希望所有路徑都需要有ROLE_USER權限,那麼請求的所有token必須有這個權限,否則會Access is denied
現在有了資源服務器,還需要授權服務器,在spring裏面可以使用
org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter
來配置。授權服務器需要配置
ClientDetailsServiceConfigurer 和
AuthorizationServerEndpointsConfigurer
ClientDetailsServiceConfigurer 可以存儲client相關信息,比如client_id,client_secret.如下代碼
clients.inMemory() // 基於內存 .withClient("app") //授權客戶端 .secret(passwordEncoder.encode("app-secret")) //授權碼 .accessTokenValiditySeconds((int) TimeUnit.HOURS.toSeconds(1)) // 授權過期時間 .authorizedGrantTypes("client_credentials", "refresh_token") // 授權模式 .scopes("all") // 授權範圍 .authorities("ROLE_USER") .resourceIds("oauth2-resource"); // 授權資源
是配置了一個相對完善的client信息。
AuthorizationServerEndpointsConfigurer 裏面需要指定tokenStore,這裏使用的tokenStore需要同資源服務器的一致,保證授權服務籤的token可以被資源服務通過。
配置還是比較簡單,原理也比較清楚,可以實際接第三方試試