spring boot + shiro 实现单点登陆/并发登入控制 踢出用户功能(禁止用户多点登录或重复登录)

本文介绍了如何在Spring Boot项目中结合Shiro实现单点登录和并发登录控制,确保一个账号只能由一个用户使用。通过自定义 KickoutSessionControlFilter 继承 AccessControlFilter,实现当用户在另一处登录时踢出前一次登录的用户。在shiroConfig中配置该过滤器,并调整过滤规则,以阻止重复登录并删除旧会话。
摘要由CSDN通过智能技术生成

需求:

springboot整合shiro项目。因为shiro只是一个Java安全框架,并不会做重复登录的拦截,当一个用户登录成功后(chrome登录),再用另外一个浏览器登录(IE登录)或者另外一台电脑进行登录,两个都会登录成功,两个不同的session。

预期目的:不允许重复登录,限定一个账号一个用户登陆,并且是挤掉前一个用户(踢出用户),保证一个帐号只能同时一个人使用,例如微信和qq等。

预设解决方法:当第二次登录时,把第一个session剔除
使用的技术其实是 shiro的自定义filter,在shiroConfig的ShiroFilterFactoryBean中使用的过滤规则,通过调用各自对应的filter方式集成,使用自定义filter实现并发登入控制,废话不多说上代码!!

1.首先写一个KickoutSessionControlFilter类继承AccessControlFilter类
package com.kalvan.web.shiro.interceptor;

import com.kalvan.web.shiro.user.ShiroUserInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Deque;
import java.util.LinkedList;

/**
 * shiro 自定义filter 实现 并发登录控制
 */
@Slf4j
public class KickoutSessionControlFilter extends AccessControlFilter {
   

    /**
     * 踢出后到的地址
     */
    private String kickoutUrl;

    /**
     * 踢出之前登录的/之后登录的用户 默认踢出之前登录的用户
     */
    private boolean kickoutAfter = false;

    /**
     * 同一个帐号最大会话数 默认1
     */
    private int maxSession = 1;
    private SessionManager sessionManager;
    private Cache<String, Deque<Serializable>> cache;

    public 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值