1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dromara-sa-token

 / Детали:

В момент входа с использованием токена немедленно происходит выход из системы.

Предстоит сделать
Владелец
Создано  
21.04.2025

Используемые версии:

<dependency>
           <groupId>cn.dev33</groupId>
           <artifactId>sa-token-spring-boot3-starter</artifactId>
       </dependency>
       <dependency>
           <groupId>cn.dev33</groupId>
           <artifactId>sa-token-redis-template</artifactId>
       </dependency>
       <dependency>
           <groupId>cn.dev33</groupId>
           <artifactId>sa-token-fastjson</artifactId>
       </dependency>

В涉的功能模块:

Логин модуль

     @SaIgnore
     @PostMapping("/weChatRegister")
     public SaResult weChatRegister(@RequestBody Map<String, String> data) {
          String js_code = data.get("js_code");
          Map<String, String> openIdAndUnionId = getWeChatOpenidAndUnionid.getOpenIdAndUnionId(js_code);
         String openid = openIdAndUnionId.get("openid");
         String unionid = openIdAndUnionId.get("unionid");
          User existingUser = getUser(unionid);
          if (existingUser != null) {
             StpUtil.login(existingUser.getId());
             SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
             log.info("Аккаунт {} успешно вошел в систему (loginType=login), сессионный токен token={}", existingUser.getId(), tokenInfo.getTokenValue());
             return SaResult.data(tokenInfo);
         }
          User user = new User();
         user.setUsername("微信用户");
         user.setPassword("null");
         user.setCreateTime(LocalDateTime.now());
         user.setWechatOpenid(openid);
         user.setWechatUnionid(unionid);
         userService.save(user);
          User newUser = getUser( Yöntem );
          StpUtil.login(newUser.getId());
         SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
         log.info("Аккаунт {} успешно вошел в систему (loginType=login), сессионный токен token={}", newUser.getId(), tokenInfo.getTokenValue());
         return SaResult.data(tokenInfo);
     }
 ```### Шаги тестирования:
+ Я прошел следующие шаги для тестирования:
Настройка перехватчика

@Configuration
public class WebConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(WebConfig.class);
@Autowired
private LoggingInterceptor loggingInterceptor;
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("
")
.allowCredentials(true)
.maxAge(3600);
}
}

allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(3600);
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loggingInterceptor);
        registry.addInterceptor(new SaInterceptor(handler -> {
            StpUtil.checkLogin();
        })).addPathPatterns();
    }
}
``````yml
sa-token:
  # имя токена (также является именем cookie)
  token-name: satoken
  # префикс токена
  token-prefix: Bearer
  # срок действия токена (в секундах) по умолчанию 30 дней, -1 означает вечное действие
  timeout: 2592000
  # минимальная активность токена (в секундах), если токен не был использован в течение этого времени, он будет заморожен, по умолчанию -1 означает отсутствие ограничений, токен никогда не будет заморожен
  active-timeout: -1
  # разрешено ли одновременному входу одного аккаунта с разных мест (true - разрешено, false - запрещено)
  is-concurrent: true
  # разделяются ли токены при одновременном входе нескольких пользователей в один аккаунт (true - разделяются, false - каждый вход создаёт новый токен)
  is-share: false
  # стиль токена (по умолчанию может быть uuid, simple-uuid, random-32, random-64, random-128, tik)
  token-style: uuid
  # включено ли логирование действий
  is-log: true
```

```java
@SpringBootApplication
public class Application {
   public static void main(String[] args) throws JsonProcessingException {
       SpringApplication.run(Application.class, args);
   }
}
```Получены следующие результаты:
При попытке входа с использованием токена происходит немедленное отключение:
```plaintext
2025-04-13 18:06:23 INFO  c. m. b. c. L. LoggingInterceptor - Ответный статус: 200
2025-04-13 18:06:32 INFO  c. m. b. c. L. LoggingInterceptor - Запрос URL: http://localhost:8081/login/weChatRegister, метод: POST, параметры запроса: null
2025-04-13 18:06:33 INFO  com. zaxxer. hikari. HikariDataSource - HikariPool-1 - Начало. . .
2025-04-13 18:06:33 INFO  com. zaxxer. hikari. pool. HikariPool - HikariPool-1 - Добавлено соединение com. mysql. cj. jdbc. ConnectionImpl@33b1e694
2025-04-13 18:06:33 INFO  com. zaxxer. hikari. HikariDataSource - HikariPool-1 - Начало завершено.
SA [INFO] -->: Аккаунт 1 успешно вошёл (loginType=login), сессионный токен token=d6329e90-4b2e-4996-a379-1b64dedb9644
SA [INFO] -->: Аккаунт 1 вышел (loginType=login), сессионный токен token=7e56b24d-1127-40f4-a15c-34714f5fe918
2025-04-13 18:06:34 INFO  c. m. b. controller.
```LoginController - Успешный вход пользователя 1 (loginType=login), сессионный токен token=d6329e90-4b2e-4996-a379-1b64dedb9644```  
  + В коде на строке xx отмечено несоответствие описанию в документации:
 + Мое понимание заключается в следующем:
 Должен быть использован один метод для инициирования выхода из системы.
 Как мне избежать немедленного выхода после входа? Или как правильно инициировать выход?
 Прошу подтвердить, является ли мое понимание неверным, или же проблема в документации?
  ```

Комментарий (0)

GitLife Service Account Задача создана

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/dromara-sa-token.git
git@api.gitlife.ru:oschina-mirror/dromara-sa-token.git
oschina-mirror
dromara-sa-token
dromara-sa-token