сценарий спроса
Блокировка учетных записей является относительно распространенным бизнес-требованием, особенно на форумах и проектах сообщества.Когда есть нелегальные пользователи, мы должны немедленно заблокировать их учетные записи.
Общая идея дизайна такова: в дизайне用户表
При добавлении поля состояния, например:status
, при значении 1 учетная запись нормальная, при значении 0 учетная запись заблокирована.
Когда нам нужно заблокировать учетную запись, нам нужно только изменить ее учетную записьstatus
Значение можно изменить на 0. Когда другая сторона снова войдет в систему, мы можем обнаружитьstatus
Значение не регистрируется как бан.
Хотя эта модель имеет простую идею, у нее также есть большая проблема, а именно: что, если другая сторона всегда онлайн и не выходит из системы?
Поскольку мы обнаруживаем только при входе в системуstatus
значение, что означает, что если другая сторона не выйдет из учетной записи активно, его сеанс все равно будет существовать и быть действительным.
Так как же он может вступить в силу сразу после блокировки аккаунта?
Вы можете подумать об использовании перехватчика для перехвата всех пользовательских запросов на проверку состояния учетной записи:status=0
Доступ запрещен,status=1
отпустить запрос
Хотя этот метод решает проблему, если вам приходится запрашивать базу данных для каждого запроса, база данных означает, что у вас нет психологического давления, чтобы меня вот так заметать?
Что делать тогда? кеш? Хотя это может снизить нагрузку на производительность, всегда кажется, что это не решает проблему идеально.
Настоящая проблема в том, что в обычной системе нужно забанить только 0,01% пользователей, а обнаружение остальных 99,99% пользователей в режиме реального времени — ненужная трата производительности.
В приведенном выше сценарии, что нам действительно нужно, так это операция кикания кого-либо в оффлайне, то есть: после того, как мы забаним пользователя, его сессия будет немедленно отключена, даже если он снова войдет в систему, ему будет запрещен вход в систему.
Итак, как выгнать кого-то из сети в режиме реального времени?
Автор использует SA-Token Permission Authentication Framework.Эта структура инкапсулирует то, что очень удобно отключать вызовы офлайн-операций.Вам не нужно поднимать уровень себя, как в других платформах.
специальный код
- сначала добавить
pom.xml
Рамка
<!-- sa-token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.12.1</version>
</dependency>
- Запишите идентификатор учетной записи в сеанс, когда пользователь входит в систему.
@RestController
@RequestMapping("user")
public class UserController {
@RequestMapping("doLogin")
public String doLogin(String username, String password) {
// 此处仅作示例模拟,真实项目需要从数据库中查询数据进行比对
if("zhang".equals(username) && "123456".equals(password)) {
StpUtil.setLoginId(10001);
return "登录成功";
}
return "登录失败";
}
}
- Учетная запись, которая будет указывать идентификатор
// 使指定id账号的会话注销登录,对方再次访问系统时会抛出`NotLoginException`异常,场景值为-5
@RequestMapping("kickout")
public String kickout(long userId) {
StpUtil.logoutByLoginId(userId);
return "剔出成功";
}
Ключевой кодStpUtil.logoutByLoginId(userId)
Это предложение заставляет учетную запись с указанным идентификатором выйти из системы и войти в нее (кикнуть человека в автономном режиме)
Если вы считаете, что статья написана хорошо, пожалуйста, не стесняйтесь поставить ей палец вверх Ваша поддержка - самая большая мотивация для моего обновления!
Наконец, ссылка на проект прилагается:
- Документы официального сайта:sa-token.dev33.cn/
- Адрес с открытым исходным кодом Gitee:git ee.com/even6/sprinkle-to-can…
- Адрес с открытым исходным кодом на GitHub:GitHub.com/click33/ Цезарь - ...