zoukankan      html  css  js  c++  java
  • 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权限管理系统 欢迎关注

  • 相关阅读:
    WeX5那些坑
    项目总结-微信公众平台Html5
    项目总结-APP中的HTML5
    夜幕团队成员的工资究竟几 K ?
    Docker竟然还能这么玩?商业级4G代理搭建实战!
    今天,大佬云集的夜幕团队正式成立了!
    InnoDB物理行中null值的存储的推断与验证
    探究InnoDB数据页内部行的存储方式
    DAO模式
    JDBC
  • 原文地址:https://www.cnblogs.com/leng-leng/p/13064848.html
Copyright © 2011-2022 走看看