Spring Security OAuth过期的解决方法

下面是针对“Spring Security OAuth过期的解决方法”的完整攻略:

Spring Security OAuth过期的解决方法

问题描述

在使用Spring Security OAuth时,有可能会遇到令牌(expired_token)过期的问题,导致无法访问受保护的资源。这时需要找到一种解决办法。

解决方法

方法一:自定义TokenService

通过自定义TokenService来调整Token的过期时间。

步骤一:自定义TokenService

public class CustomTokenService extends DefaultTokenServices {

    private long customeTokenValiditySeconds = 60 * 60 * 24 * 30; // Token有效时间 30天

    public void setCustomeTokenValiditySeconds(long customeTokenValiditySeconds) {
        this.customeTokenValiditySeconds = customeTokenValiditySeconds;
    }

    @Override
    public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {
        OAuth2AccessToken token = super.createAccessToken(authentication);
        DefaultOAuth2AccessToken copy = new DefaultOAuth2AccessToken(token);
        copy.setExpiration(new Date(System.currentTimeMillis() + customeTokenValiditySeconds * 1000L));
        return copy;
    }
}

步骤二:在配置文件中注入自定义TokenService

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private ClientDetailsService clientDetailsService;

    @Value("${security.jwt.client-id}")
    private String clientId;

    @Value("${security.jwt.client-secret}")
    private String clientSecret;

    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private AccessTokenConverter accessTokenConverter;

    // 把原有的DefaultTokenServices替换成自定义的CustomTokenService
    @Bean
    public AuthorizationServerTokenServices tokenServices() {
        CustomTokenService customTokenService = new CustomTokenService();
        customTokenService.setTokenStore(tokenStore);
        customTokenService.setTokenEnhancer(accessTokenConverter);
        customTokenService.setSupportRefreshToken(true);
        customTokenService.setAccessTokenValiditySeconds(1800); // Token有效时间 30分钟
        customTokenService.setRefreshTokenValiditySeconds(1800); // Refresh Token有效时间 30分钟
        return customTokenService;
    }

    ...
}

方法二:使用redis存储令牌

将令牌存储到redis中,并使用redis的过期机制来管理令牌的有效期。

步骤一:引入redis依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

步骤二:修改授权服务器配置,使用RedisTokenStore存储Token

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private ClientDetailsService clientDetailsService;

    @Value("${security.jwt.client-id}")
    private String clientId;

    @Value("${security.jwt.client-secret}")
    private String clientSecret;

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    // 把原有的JdbcTokenStore替换成RedisTokenStore
    @Bean
    public TokenStore tokenStore() {
        return new RedisTokenStore(redisConnectionFactory);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        ...
    }

    ...
}

示例

示例一:使用自定义TokenService

#第一次获取token,30分钟过期
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=password&username=user1&password=passw0rd" \
"http://localhost:8080/oauth/token?client_id=test-client&client_secret=test-secret"

#等待30分钟后,再次使用token访问受保护的资源
curl -H "Authorization: Bearer [token]" "http://localhost:8080/api/resource"
#返回:{
#   "code": 401,
#   "message": "Unauthorized",
#   "data": null
#}

示例二:使用redis存储token

#第一次获取token,30分钟过期
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=password&username=user1&password=passw0rd" \
"http://localhost:8080/oauth/token?client_id=test-client&client_secret=test-secret"

#从redis中查看token是否存在
redis-cli keys auth:token:*

#等待30分钟后,再次使用token访问受保护的资源
curl -H "Authorization: Bearer [token]" "http://localhost:8080/api/resource"
#返回:{
#   "code": 401,
#   "message": "Unauthorized",
#   "data": null
#}

#再次从redis中查看token是否存在
redis-cli keys auth:token:*

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security OAuth过期的解决方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Springmvc数据格式化原理及代码案例

    SpringMVC数据格式化原理及代码案例 在SpringMVC中,我们可以使用数据格式化器来将请求参数转换为Java对象或将Java对象转换为响应参数。本文将详细讲解SpringMVC数据格式化的原理及代码案例。 数据格式化原理 SpringMVC的数据格式化器是通过实现Converter接口或Formatter接口来实现的。Converter接口用于将一…

    Java 2023年5月18日
    00
  • Java Properties作为集合三个方法详解

    当我们使用Java进行编程时,经常需要使用配置文件来存储一些关键的配置信息,于是Java提供了一个名为Properties的类来处理这个问题。Properties是一个Map集合,其中的key和value都必须是字符串类型。下面将详细讲解Java Properties作为集合的三个常用方法:getProperty、setProperty和load。 getP…

    Java 2023年6月15日
    00
  • SpringMVC的详细架构你了解嘛

    以下是关于“SpringMVC的详细架构”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一个基于MVC(Model-View-Controller)模式的Web框架,它是Spring框架的一部分。SpringMVC提供了一种灵活的方式来开发Web应用程序,它具有良好的可扩展性和可维护性。本攻略将详细讲解SpringMVC的架构,帮助读者更好…

    Java 2023年5月16日
    00
  • springmvc url处理映射的三种方式集合

    SpringMVC 的 URL 处理映射可以通过以下三种方式来实现: 注解方式 XML 配置方式 接口方式 接下来我们将对这三种方式进行详细的讲解,并且提供两个示例供您参考。 1. 注解方式 注解方式是 SpringMVC 使用最广泛的一种 URL 处理映射方式。通过在 Controller 的方法上添加相应的注解来指定 URL 映射规则。 以下是一个 @R…

    Java 2023年6月15日
    00
  • SpringBoot定时任务设计之时间轮案例原理详解

    SpringBoot定时任务设计之时间轮案例原理详解 本文将详细介绍SpringBoot定时任务设计之时间轮案例,讲解时间轮的基本原理和实现方式,以及如何在SpringBoot中实现定时任务的调度。 基本原理 时间轮是一种常见的定时任务调度算法,它的基本原理是将时间线性化,并按照固定的时间间隔划分成若干个时间槽,将任务按照配合它触发时间所在的时间槽进行存储和…

    Java 2023年5月20日
    00
  • spring Mvc配置xml使ResponseBody返回Json的方法示例

    Spring MVC配置XML使@ResponseBody返回JSON的方法示例 在Spring MVC中,我们可以使用@ResponseBody注解将方法返回的对象转换为JSON格式,并返回给客户端。下面是使用XML配置的方法示例。 1. 添加Jackson依赖 在pom.xml文件中添加以下依赖: <dependency> <group…

    Java 2023年5月18日
    00
  • kafka运维consumer-groups.sh消费者组管理

    Kafka运维:consumer-groups.sh消费者组管理 什么是消费者组 Kafka中的消费者组是由一组消费者共同消费一个或多个主题(topics)的机制。消费者组可以有效地提高消息的吞吐量,同时还提供了在消费者之间分摊相同数量的分区以实现负载均衡的机制。 consumer-groups.sh命令 consumer-groups.sh是Kafka提供…

    Java 2023年5月20日
    00
  • SpringBoot快速入门详解

    Spring Boot快速入门详解 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、便捷的方式来创建基于Spring的应用程序,同时也提供了一些默认的和约定,使得开发人员可以更加专注于业务逻辑的实现。本文将详细讲解如何使用Spring Boot快速入门,并提供两个示例。 1. 创建Spring Boot应用程序 首…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部