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

Spring boot 2.0.3+Security+Oauth2自动配置

和飞翔
2023-03-14

Spring boot 2.0.3+Security+Oauth2自动配置

我正在使用OAuth2和微服务,我创建了一个微服务来生成授权令牌,另一个微服务作为客户端。令牌的生成工作正常,但当我试图在客户端服务上使用这个生成的令牌进行身份验证时,它却不工作。

生成令牌的微服务:localhost:9999

使用URL:estrutura:estruturasecret@localhost:9999/OAuth/Token生成的令牌

   [
       {
          "key":"grant_type",
          "value":"password"
       },
       {
          "key":"username",
          "value":"matheus"
       },
       {
          "key":"password",
          "value":"teste"
       },
       {
          "key":"client_id",
          "value":"estrutura"
       }
    ]

返回:

 {
        "access_token": "2e4c26b3-0fcf-493e-a255-6216b98811c5",
        "token_type": "bearer",
        "refresh_token": "5e33740a-ccb9-4ec1-94be-3a4643b8097a",
        "expires_in": 42479,
        "scope": "read write"
    }
@SpringBootApplication
@EnableResourceServer
public class ClientServer {
   public static void main(String[] args) {
      SpringApplication.run(ClientServer.class, args);
   }
}
server:
  port: 9090
  servlet:
    context-path: /client
spring:
  application:
    name: client-server
  security:
    oauth2:
      client:
        client-id: estrutura
        client-secret: estruturasecret
        access-token-uri: localhost:9999/oauth/token
        user-authorization-uri: localhost:9999/oauth/authorize
      resource:
        token-info-uri: localhost:9999/oauth/check_token
logging:
  level:
    org.springframework.security: DEBUG
<error>invalid_token</error>
<error_description>Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5</error_description>
2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] o.s.security.web.FilterChainProxy        : /alunos at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2AuthenticationProcessingFilter'
2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="invalid_token", error_description="Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"
2018-06-26 11:24:42.645 DEBUG 18658 --- [nio-9090-exec-2] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@1fa75b
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.o.p.e.DefaultOAuth2ExceptionRenderer : Written [error="invalid_token", error_description="Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"] as "application/xml;charset=UTF-8" using [org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@30d6fa45]
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed

文档:https://docs.spring.io/spring-security-oauth2-boot/docs/current-snapshot/reference/htmlsingle/#boot-features-security-oauth2-auth2-authorization-server

共有1个答案

方野
2023-03-14

我试图复制您的用例:我开发了一个带有spring cloud security的AuthServer和一个ResourceServer。我看到的使用token-info-uri策略的问题是spring为了检查令牌而使用RemoteTokenServices,它为了检索令牌信息而使用OAuth2RestTemplate说,如果您想使用您的配置,请插入如下所示的这种配置:

@EnableOAuth2Client
@EnableResourceServer
@SpringBootApplication
public class HelloOauthServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloOauthServiceApplication.class, args);
    }

    @Bean
    public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails resource){
        return new OAuth2RestTemplate(resource);
    }
}

注意@enableoauth2clientoauth2resttemplatebean定义。spring使用这些配置来有效和刷新令牌。

然而,以这种方式,任何资源服务器都必须同时是一个客户端应用程序,而且根据我的经验,它是不伸缩的。我个人的建议是使用user-info-uri策略。在这种情况下,spring将使用一个特殊的endpoint来检索用户信息。在您的资源服务器中,配置非常简单,您只定义了@enableResourceServer,就像您的示例一样,在您的yaml中,您只能配置资源部分,如下所示

security:
  oauth2:
    resource:
     user-info-uri: http://localhost:9090/account/userInfo.json
     preferTokenInfo: false

唯一的附加开发是在您的身份验证服务器中,它必须在endpoint中公开用户信息,如下所示:

@RestController
@RequestMapping("/account")
class UserRestFullEndPoint {

    @GetMapping("/userInfo")
    public Principal userInfo(Principal principal){
        return principal;
    }
}

我多次使用这种方法,我注意到它工作得很好,而且可以扩展,因为在您的资源服务器中,您没有像定义客户端应用程序一样定义它。

PS:在您的配置中,您忘记了http协议:

server:
  port: 9090
  servlet:
    context-path: /client
    spring:
      application:
        name: client-server
      security:
        oauth2:
          client:
            client-id: estrutura
            client-secret: estruturasecret
            access-token-uri: http://localhost:9999/oauth/token
            user-authorization-uri: http://localhost:9999/oauth/authorize
          resource:
            token-info-uri: http://localhost:9999/oauth/check_token
    logging:
      level:
        org.springframework.security: DEBUG
 类似资料:
  • 问题内容: 我正在尝试使用spring-security-oauth2和jwt配置授权服务器。 我的主要: 我的安全性配置: 我的身份验证服务器配置: 和一个访问当前用户的Web服务: 现在,如果我发出这样的帖子请求: 我有这样的回应: 如果我使用访问令牌来调用我的用户WS: 我得到一个空响应。 但是,如果我在“安全性”配置中输入以下内容: 然后,我获得适当的响应。 有人可以解释一下这是怎么回事吗

  • 我尝试了一切,但我似乎无法禁用Spring启动2.1.10中的Spring安全自动配置--我认为自动配置似乎是由执行器触发的,但我试图排除几乎所有可能的类,但似乎仍然引入了过滤链。当我通过属性文件进行配置时,它短暂地工作了一下,但又停止了工作。 我试过了

  • 在迁移到Spring Boot 2.1之前,我们在服务中使用与结合进行了几次控制器测试: 这导致Spring Security配置被禁用,您可以在不模拟OAuth/JWT的情况下运行MVC测试。 在Spring Boot 2.1中,不推荐使用secured属性,发行说明中提到 [...] @WebMvcTest查找WebSecurity配置程序bean[…]。 为了避免不推荐的安全属性和加载我们的

  • 我在Spring中的当前权限集支持一个组中具有某个权限级别的用户,因此如下所示: 一个用户(实现UserDetails)在一个组中有一个权限(加入User+Group,赋予GrantedAuthority)。对于HTTP身份验证,用户可以在其组中执行操作并在组之间切换。

  • 我试图在java配置上配置Spring Security性和OAuth2。我使用的是Spring Security版本4.0.4。发布并发布OAuth2版本2.0.11。释放 Spring Security配置工作良好。此外,我可以使用OAuth2 AuthorizationServer获得访问令牌,但我的ResourceServer无法正常工作。当我设置注释@EnableResourceServ

  • 我试图将Spring security OAuth2配置从2.0.0.RC1升级到2.0.3.RELEASE。当时我从sprklr示例中复制了配置并使其工作。因此,它基于一个基于xml的Spring Security OAuth2配置的工作示例。 现在,我已经升级到Spring Security最新版本(在撰写本文时为2.0.3),并尝试将其转换为java配置。我正在下面发布xml配置和java配