spring security oauth2密码模式改造咨询

spring security oauth2默认获取token端点是/oauth/token,如何能实现新增一个端点接口用于指定clientId获取token(比如固定密码模式)?就是说这个URL请求不需要传clientId和clientSecret、grant_type,就可以返回token,用于提供给app登录使用(也就是密码模式,但是oauth2 client信息不存在app客户端)

阅读 2.3k
1 个回答

你可以直接编写 controller,提供一个接口,在处理中添加上 client_id 和 client_secret 参数后将请求转发至原获取 token 的端点。

或者你可以使用普通的 Filter 或者在网关使用 WebFilter 实现类似的逻辑。

比如可以在网关自己实现一个给请求增加额外参数的过滤器(只是个例子):

// 省略 import

@Component
public class AddParamsGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {

  @Override
  public GatewayFilter apply(Object config) {
    return new AddParamsFilter();
  }

}
// 省略 import

public class AddParamsFilter implements GatewayFilter, Ordered {

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    URI uri = exchange.getRequest().getURI();

    // 这里使用了 org.springframework.web.util.UriComponentsBuilder,实际业务请按自己需求实现
    URI newUri = UriComponentsBuilder.fromUri(uri)
      // 替换一些参数
      .replaceQuery("client_id=gateway&response_type=code&redirect_uri=https://www.baidu.com")
      .build(true)
      .toUri();

    ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri).build();

    return chain.filter(exchange.mutate().request(request).build());
  }

  @Override
  public int getOrder() {
    return 0;
  }

}
# application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: example
          uri: lb://example-server
          predicates:
            - Path=/your_path
          filters:
            - AddParams
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题