首页 > 解决方案 > NoSuchBeanDefinitionException:没有 'org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails 类型的合格 bean

问题描述

在过去的 10 天里,我一直在努力解决这个问题,并且无法在线找到帮助。我正在遵循 Pivotal SSO 示例中给出的代码,并且示例按预期工作正常,但是当我将代码复制到我们的项目时,我收到 NoSuchBeanDefinition 异常

2018-09-12T10:39:03.823-05:00 [APP/PROC/WEB/0] [OUT] Caused by: 
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 
org.springframework.security.oauth2.client.resource.
OAuth2ProtectedResourceDetaiis available: expected at least 1 bean which 
qualifies as autowire candidate. Dependency annotations: {}

我的依赖版本如下

<org.springframework.version>4.3.0.RELEASE</org.springframework.version>
<spring.security.version>5.0.8.RELEASE</spring.security.version>
<spring.ws.version>2.3.0.RELEASE</spring.ws.version>
<spring-boot.version>2.0.4.RELEASE</spring-boot.version>
<spring-cloud.dependencies.version>Finchley.RELEASE</spring-cloud.dependencies.version>
<spring-cloud-services.dependecies.version>2.0.1.RELEASE</spring-cloud-services.dependecies.version>

这是我的代码

import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider;
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider;
import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider;
import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider;
import org.springframework.security.oauth2.common.OAuth2AccessToken;

@Autowired
private OAuth2RestTemplate oauth2RestTemplate;

@Autowired
private ObjectMapper objectMapper;

@Value("${security.oauth2.client.clientId:placeholder}")
    private String clientId;

    // property set by spring-cloud-sso-connector
    @Value("${ssoServiceUrl:placeholder}")
    private String ssoServiceUrl;

    @PostConstruct
    public void init() {
        oauth2RestTemplate.setAccessTokenProvider(accessTokenProviderChain());
    }   

    @Bean
    public OAuth2RestTemplate oauth2RestTemplate(OAuth2ProtectedResourceDetails oa2prd, OAuth2ClientContext oa2cc) {
        return new OAuth2RestTemplate(oa2prd, oa2cc);
    }

    @Bean
    public AccessTokenProvider accessTokenProviderChain() {
        return new AccessTokenProviderChain(Arrays.<AccessTokenProvider>asList(new OpenIDTokenProvider(),
                new AuthorizationCodeAccessTokenProvider(), new ImplicitAccessTokenProvider(),
                new ResourceOwnerPasswordAccessTokenProvider(), new ClientCredentialsAccessTokenProvider()));
    }

@RequestMapping("/authorization_code")
    public String authCode(Model model, HttpServletRequest request) throws Exception {
        if (ssoServiceUrl.equals("placeholder")) {
            model.addAttribute("header", "Warning: You need to bind to the SSO service.");
            model.addAttribute("warning", "Please bind your app to restore regular functionality");
            return "configure_warning";
        }
        Map<?, ?> userInfoResponse = oauth2RestTemplate.getForObject("{ssoServiceUrl}/userinfo", Map.class,
                ssoServiceUrl);
        model.addAttribute("ssoServiceUrl", ssoServiceUrl);
        model.addAttribute("response", toPrettyJsonString(userInfoResponse));

        OAuth2AccessToken accessToken = oauth2RestTemplate.getOAuth2ClientContext().getAccessToken();
        if (accessToken != null) {
            model.addAttribute("access_token", toPrettyJsonString(parseToken(accessToken.getValue())));
            model.addAttribute("id_token",
                    toPrettyJsonString(parseToken((String) accessToken.getAdditionalInformation().get("id_token"))));
        }
        return "authorization_code";
    }

非常感谢任何帮助。

标签: springoauth-2.0cloudsingle-sign-onpcf

解决方案


推荐阅读