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

Spring 安全自定义身份验证提供程序始终导致错误的客户端凭据

怀飞扬
2023-03-14

我正在 Spring 安全性中实现一个自定义身份验证提供程序,用于对用户进行身份验证。身份验证服务器位于远程端(Restful 服务)。每次我调用我的服务时,我都会遇到此错误(此代码达到

返回新的 UsernamePasswordAuthenticationToken(userDetails, authentication.getCredentials().toString(), grantedAuthority); 部分 )

{"error":"invalid_client","error_description":"Bad client credentials"}

这是我的代码:

public class CustomAuthenticationProvider implements AuthenticationProvider {


@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {

    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());
    RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(60 * 1000)
            .setSocketTimeout(60 * 1000).build();
    PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
    poolingHttpClientConnectionManager.setMaxTotal(20);
    poolingHttpClientConnectionManager.setDefaultMaxPerRoute(20);
    CloseableHttpClient httpClientBuilder = HttpClientBuilder.create()
            .setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig)
            .build();
    requestFactory.setHttpClient(httpClientBuilder);
    RestTemplate restTemplate = new RestTemplate(requestFactory);

    UserInfoRequestBean userInfoRequestBean = new UserInfoRequestBean();

    String username = (String)authentication.getPrincipal();
    userInfoRequestBean.setUsername(username);
    userInfoRequestBean.setPassword((String)authentication.getCredentials());

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    HttpEntity<?> httpEntity = new HttpEntity<UserInfoRequestBean>(userInfoRequestBean, headers);

    try{                                
        ResponseBean<LoginResponseBean> responseBody = restTemplate.exchange(getLoginUrl(), HttpMethod.POST, httpEntity, new ParameterizedTypeReference<ResponseBean<LoginResponseBean>>() {}).getBody();
        UserDetails userDetails = new UserDetails();
        userDetails.setGender(responseBody.getResult().getGender());
        userDetails.setLastLoginDate(new Date());
        userDetails.setYaghutSessionId(responseBody.getResult().getSessionId());
        userDetails.setName(responseBody.getResult().getName());
        userDetails.setUsername(username);

        List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
        // Granting authorization roles to user
        grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER"));

        return new UsernamePasswordAuthenticationToken(userDetails, authentication.getCredentials().toString(), grantedAuthorities);

    }catch (RestClientException exp) {
        exp.printStackTrace();
        //TODO: implement this method
    }

    return null;
}

@Override
public boolean supports(Class<?> authentication) {
    // TODO Auto-generated method stub
    return true;
}

private String getLoginUrl(){
    //return restful service url
}

}
<bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />


<bean id="clientCredentialsTokenEndpointFilter"
      class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
    <property name="authenticationManager" ref="customAuthenticationManager" />
</bean>

<bean id="clientAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="test/client" />
    <property name="typeName" value="Basic" />
</bean>


<bean id="customProvider"
    class="com.adpdigital.idm.security.provider.CustomAuthenticationProvider" />

<authentication-manager id="customAuthenticationManager"
    xmlns="http://www.springframework.org/schema/security">
    <authentication-provider ref="customProvider" />
</authentication-manager> 

<http pattern="/oauth/token" create-session="stateless" authentication-manager-ref="customAuthenticationManager"
    xmlns="http://www.springframework.org/schema/security">
    <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY"/>
    <anonymous enabled="false"/>
    <http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <!-- include this only if you need to authenticate clients via request parameters -->
    <custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
    <access-denied-handler ref="oauthAccessDeniedHandler" />
</http>

共有1个答案

严天逸
2023-03-14

而不是传递用户详细信息,只需传递用户名,当返回用户名密码身份验证令牌时。下面是一个例子——

return new UsernamePasswordAuthenticationToken(username, authentication.getCredentials().toString(), grantedAuthorities);
 类似资料:
  • 我想为Spring Security配置L 我配置spring-security.xml指出m 如何设置为 Spring,使用我的自定义类而不是他的 deafaul LDAP 身份验证提供程序?

  • 我的问题是,我希望有两个身份验证提供商 之前:我有我的UserDetailServiceImpl,我根据数据库中的数据验证了用户的身份(不确定是哪个提供者) 现在:我使用了ActiveDirectoryLdapAuthentiation提供程序,如下所示 我成功了,所以我可以认证。 问题是: 我现在无法再使用数据库用户登录,现在只有LDAP。 未使用UserDetailsService,因此用户具

  • 我为我的英语道歉。我提出了以下问题。我在与C#asp合作。NETMVC5。 我正在使用OAuth 2承载令牌和令牌刷新实现一个服务器。请求访问令牌时,返回我刷新令牌和具有客户端凭据授权类型、客户端id和客户端机密的令牌。问题是应用来自令牌的新刷新令牌。当我发送grant_类型refresh_token和refresh_token参数时,第一个方法称为ValidateClientAuthentica

  • 我正在将应用程序的安全性迁移到Spring Security4.0。我的要求是身份验证应该是JAAS身份验证,自动化数据将从数据库中提取。所以我已经编写和自定义了身份验证提供程序。但我的问题是Spring没有将身份验证请求委托给我的自定义身份验证提供程序。 代码如下 web.xml条目 调用堆栈

  • 在我的firebase应用程序中,用户可以使用 Google(Firebase的联邦提供商)或 Slack(作为自定义身份验证提供程序实现) 我想给用户链接两个帐户的机会。所以我要开的案子是: 用户使用Google登录 用户转到“设置”并单击“使用松弛连接” 然后应该链接用户帐户,以便他下次可以使用Slack或Google登录 我现在想知道,我是否可以通过某种方式从我的自定义松弛身份验证获得一个A

  • 我正在尝试为正在进行的 spring-boot 项目实现身份验证和授权服务。我已经实现了一个基于 JPA 的身份验证提供程序,它工作正常。如何将 LDAP 身份验证提供程序添加到同一项目并根据用户身份验证类型在身份验证方法之间切换? 下面是我的代码 虽然我的LDAP证书是正确的,但它没有达到那个方法。如何从DB ex(LDAP、JPA、SSO)获取我的应用程序的身份验证方法,并执行相应的身份验证提

  • 我有一个使用bouncycastle库的Java applet。当我在Eclipse上运行应用程序时,一切正常,但当我在带有标记的浏览器上使用applet时,当我添加安全BouncyCastleProvider时,它会引发异常。 我的stackTrace是: 我正在使用bcpkix-jdk15on-1.48.jar和bcprov-jdk15on-1.48.jar版本的BouncyCastle。为什

  • 我有Springmvc应用程序。我添加了带有CustomAuthentiationManager的Spring Security。这是appC中包含的application-security.xmlontex.xml.login.jsp我使用带有2个输入的标准登录页面:name='j_username'