Spring Security OAuth 2.0 發放令牌接口地址自定義


OAuth 2.0 如何獲取令牌

  • 以密碼模式為例,獲取 Token
curl --location --request POST 'http://oauth-server/oauth/token' \
--header 'Authorization: Basic dGVzdDp0ZXN0' \
--data-urlencode 'username=admin' \
--data-urlencode 'password=123456' \
--data-urlencode 'scope=server' \
--data-urlencode 'grant_type=password'
  {
   "access_token":"2YotnFZFEjr1zCsicMWpAA",
   "token_type":"example",
   "expires_in":3600,
   "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
   "example_parameter":"example_value"
 }
  • 原流程其實去訪問 OAuth 2.0 提供的 /oauth/token 源碼如下

TokenEndpoint.postAccessToken

@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
Map<String, String> parameters){
  ...
  return getResponse(token);

}

自定義默認獲取令牌地址

  • 如上文,默認情況下我們需要訪問 /oauth/token 獲取,也就是所有業務系統的 “登錄”接口 都變成這個地址,如何在不重寫此接口的情況下,自定義路徑地址。

  • Spring Security OAuth2 為我們提供了豐富的 配置,我們可以在 AuthorizationServerConfigurerAdapter 設置所有內置端點 (Endpoint)路徑的自定義 pathMapping

  • 如下 使用 /pig4cloud/login 覆蓋 原有的/oauth/token,注意這里是覆蓋一旦配置 原有路徑將失效

@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
	@Override
	public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
		endpoints
				.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
				.pathMapping("/oauth/token","/pig4cloud/login");	}
}
  • 獲取令牌地址就變成如下
curl --location --request POST 'http://oauth-server/pig4cloud/login' \
--header 'Authorization: Basic dGVzdDp0ZXN0' \
--data-urlencode 'username=admin' \
--data-urlencode 'password=123456' \
--data-urlencode 'scope=server' \
--data-urlencode 'grant_type=password'

源碼剖析

  • spring security oauth2 是如何實現 這種端點自定義配置的呢?

  • AuthorizationServerEndpointsConfigurer 被寫入到自定義 HandlerMapping

private FrameworkEndpointHandlerMapping frameworkEndpointHandlerMapping() {
  if (frameworkEndpointHandlerMapping == null) {
    frameworkEndpointHandlerMapping = new FrameworkEndpointHandlerMapping();
    frameworkEndpointHandlerMapping.setMappings(patternMap);
    frameworkEndpointHandlerMapping.setPrefix(prefix);
    frameworkEndpointHandlerMapping.setInterceptors(interceptors.toArray());
  }
  return frameworkEndpointHandlerMapping;
}
  • SpringMVC DispatcherServlet 會根據新的規則 進行路由

項目推薦: Spring Cloud 、Spring Security OAuth2的RBAC權限管理系統 歡迎關注


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM