当前位置: 首页 > 知识库问答 >
问题:

Spring Security 5.2密码流

慎兴业
2023-03-14

我正在尝试使用Spring Security-5.2最新版本中的密码流对用户进行身份验证。

医生们似乎建议了如何做到这一点。

@Bean
public OAuth2AuthorizedClientManager passwordFlowAuthorizedClientManager(
        HttpClient httpClient,
        ClientRegistrationRepository clientRegistrationRepository,
        OAuth2AuthorizedClientRepository authorizedClientRepository) {

    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(httpClient);

    DefaultPasswordTokenResponseClient c = new DefaultPasswordTokenResponseClient();
    RestTemplate client = new RestTemplate(requestFactory);
    client.setMessageConverters(Arrays.asList(
            new FormHttpMessageConverter(),
            new OAuth2AccessTokenResponseHttpMessageConverter()));
    client.setErrorHandler(new OAuth2ErrorResponseErrorHandler());
    c.setRestOperations(client);

    OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
                .password(configurer -> configurer.accessTokenResponseClient(c))
                .refreshToken()
                .build();

    DefaultOAuth2AuthorizedClientManager authorizedClientManager =
            new DefaultOAuth2AuthorizedClientManager(
                    clientRegistrationRepository, authorizedClientRepository);
    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

    authorizedClientManager.setContextAttributesMapper(authorizeRequest -> {
        Map<String, Object> contextAttributes = new HashMap<>();
        String username = authorizeRequest.getAttribute(OAuth2ParameterNames.USERNAME);
        String password = authorizeRequest.getAttribute(OAuth2ParameterNames.PASSWORD);
        contextAttributes.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, username);
        contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, password);
        return contextAttributes;
    });

    return authorizedClientManager;
}



我执行请求,可以看到HTTP头中返回的访问令牌,但是没有填充SecurityContext,会话用户保持匿名。

String username = "joe";
String password = "joe";
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
ClientRegistration r = clientRegistrationRepository.findByRegistrationId("keycloak");

OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId(r.getRegistrationId())
        .principal(authentication)
        .attributes(attrs -> {
            attrs.put(OAuth2ParameterNames.USERNAME, username);
            attrs.put(OAuth2ParameterNames.PASSWORD, password);
        })
        .build();
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);

有什么想法吗?

共有1个答案

米景辉
2023-03-14

在详细阅读了文档之后,我认为Spring Security5.2中的OAuth2密码流不像授权流那样受到支持。Spring Security 5.2为http客户机提供密码流支持,它可以缓存授权请求并在令牌过期前刷新令牌--但是没有终端用户密码流支持,客户机将凭据代理给授权服务器。

当然,完全可以通过获取凭据、实现自定义AuthenticationProvider来对最终用户进行身份验证,该自定义AuthenticationProvider将凭据与授权服务器交换为令牌,并返回持久化到上下文的OAuth2AuthenticationToken。

 类似资料:
  • 问题内容: 我已经以加密格式将用户密码存储在数据库中。但是,现在,当用户想要登录并尝试输入其原始密码时,该代码始终会将输入的(原始)密码与数据库中存储的加密版本进行比较,从而导致登录失败。 请告诉我如何比较输入的(原始)密码和存储在数据库中的加密密码。 问题答案: 几乎可以肯定,您应该对密码进行 哈希处理 ,而不是使用可逆加密。您可能还需要 用盐 来做…在这种情况下,正确的步骤是: 查找最初对密码

  • 这样,从加密消息中扫描进来的第一个字母将对应于换位槽中的第三个槽,这将是它被打印出来的地方。然而,我不知道如何将我的想法转化为代码。 电流换位加密密码: 非常基本的换位解密程序

  • 在FTPS中,密码在尝试通过internet连接服务器时被加密。这就是我所理解的,如果我的理解有任何遗漏,请更正。我的问题是,当我厌倦了模拟它(FTPs和FTP)时,我只是得到一条消息,说SSL已经建立(以及基于隐式和显式调用的端口更改)。 是否有任何其他方式来确认密码是真正加密的,或者我们可以看到密码时,它的普通FTP。下面是我在服务器端看到的日志 启用FTP时的服务器日志- 状态:TLS/SS

  • cmf_password($pw, $authCode = '') 功能 CMF密码加密方法 参数 $pw: string 要加密的原始密码 $authCode: string 加密字符串 返回 string 加密后的密码 例子 echo cmf_password('666666');

  • 我试图了解角色密码应该如何在Postgres中运行。 https://www.postgresql.org/docs/current/static/sql-createrole.html说加密/未加密 如果提供的密码字符串已经是MD5加密的格式,那么它将按原样加密存储, 所以我的未加密密码是:MyPassword。 “MyPassword”的 MD5 哈希值为 48503dfd58720bd5ff

  • 问题内容: 我正在尝试学习如何使用Java进行基于密码的加密。我在网上找到了几个示例,但在Stack Overflow上还没有(到目前为止)。这些示例对我的解释不大,尤其是在算法选择方面。似乎有很多传递字符串来说明要使用什么算法,但是很少有关于字符串来自何处以及含义的文档。而且似乎不同的算法可能需要KeySpec类的不同实现,所以我不确定哪种算法可以使用我正在查看的PBEKeySpec类。此外,所

  • 问题内容: 我需要访问joomla用户表以从外部php脚本[codeignitor]进行登录检查。 joomla这样存储密码 看起来这不是正常的MD5,所以我无法使用。 创建密码的可能方式是什么? 谢谢。 问题答案: Joomla密码是经过MD5哈希处理的,但是在哈希处理之前,已对密码进行了固定处理。它们被存储在数据库中,因为此盐是长度为32个字符的随机字符串。 因此,要创建一个新的密码哈希, 编

  • 我们是ActiveMQ新手,已经阅读了关于加密密码的文档。 本文档介绍如何设置环境变量(即ACTIVEMQ\u ENCRYPTION\u PASSWORD)以保存加密密码,启动ACTIVEMQ,然后取消设置该环境变量。但是,在服务器重启的情况下,这将如何工作呢?我们无法将该加密密码放入任何systemd服务文件。 我们的安全策略不允许加密密码保留在任何配置或设置文件中,特别是因为解密机制也可以通过