gpt4 book ai didi

仅具有客户端凭据的 Spring 安全端点(基本)

转载 作者:行者123 更新时间:2023-12-04 15:50:25 25 4
gpt4 key购买 nike

我有一个带有一个自定义端点的 oauth2 授权服务器(以管理员身份手动注销特定用户)
我希望使用其余客户端凭据(客户端 ID 和 secret 作为基本编码 header 值)来保护此端点,类似于/oauth/check_token。

只能从具有特定范围的资源服务器调用此端点。

  • 我需要检查客户端是否通过身份验证。
  • 我希望能够在 Controller 的方法上添加 @PreAuthorize("#oauth2.hasScope('TEST_SCOPE')") 。

  • 我找不到任何文档或方法来使用 Spring 的机制进行客户端身份验证检查。

    编辑 1

    我使用的是 java 配置而不是 xml 配置

    最佳答案

    所以我最终得到了以下解决方案

    身份验证管理器

    public class ClientAuthenticationManager implements AuthenticationManager {

    private ClientDetailsService clientDetailsService;
    private PasswordEncoder passwordEncoder;

    public HGClientAuthenticationManager(ClientDetailsService clientDetailsService, PasswordEncoder passwordEncoder) {
    Assert.notNull(clientDetailsService, "Given clientDetailsService must not be null!");
    Assert.notNull(passwordEncoder, "Given passwordEncoder must not be null!");
    this.clientDetailsService = clientDetailsService;
    this.passwordEncoder = passwordEncoder;
    }

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    ClientDetails clientDetails = null;
    try {
    clientDetails = this.clientDetailsService.loadClientByClientId(authentication.getPrincipal().toString());
    } catch (ClientRegistrationException e) {
    throw new BadCredentialsException("Invalid client id or password");
    }
    if (!passwordEncoder.matches(authentication.getCredentials().toString(), clientDetails.getClientSecret())) {
    throw new BadCredentialsException("Invalid client id or password");
    }
    return new OAuth2Authentication(
    new OAuth2Request(null, clientDetails.getClientId(), clientDetails.getAuthorities(), true,
    clientDetails.getScope(), clientDetails.getResourceIds(), null, null, null),
    null);
    }
    }

    过滤器声明
        private BasicAuthenticationFilter basicAuthenticationFilter() {
    ClientDetailsUserDetailsService clientDetailsUserDetailsService = new ClientDetailsUserDetailsService(
    this.clientDetailsService);
    clientDetailsUserDetailsService.setPasswordEncoder(this.passwordEncoder);
    return new BasicAuthenticationFilter(
    new ClientAuthenticationManager(this.clientDetailsService, this.passwordEncoder));
    }

    过滤器注册
    httpSecurity.addFilterBefore(this.basicAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)

    警告!!!
    这将阻止任何其他类型的身份验证(oauth2 等)。
    Basic身份验证被接受并且 对于注册客户。

    关于仅具有客户端凭据的 Spring 安全端点(基本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52494810/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com