shiro踢用户下线

shiro 踢用户下线


import com.developtools.jasypt.myjaspyt.pojo.OAUser;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.session.mgt.DefaultSessionManager;
import org.apache.shiro.session.mgt.SessionKey;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

/**
 * shiro踢出用户下线
 */
public class KickoutUtil {

    private static final Logger logger = LoggerFactory.getLogger(KickoutUtil.class);

    /**
     * 强制下綫
     *
     * @param username
     */
    public static void kickout(String username) {
        // 假设你已经配置了SecurityManager,这里仅为示例如何获取它和会话信息。
        SecurityManager securityManager = SecurityUtils.getSecurityManager(); // 确保已经配置了SecurityManager
        if (securityManager instanceof DefaultSecurityManager) {
            DefaultSecurityManager defaultSecurityManager = (DefaultSecurityManager) securityManager;
            SessionManager sessionManager = defaultSecurityManager.getSessionManager(); // 获取SessionManager
            if (sessionManager instanceof DefaultSessionManager) {
                DefaultSessionManager defaultSessionManager = (DefaultSessionManager) sessionManager;
                SessionDAO sessionDAO = defaultSessionManager.getSessionDAO(); // 获取SessionDAO
                if (sessionDAO instanceof EnterpriseCacheSessionDAO) { // 确保是EnterpriseCacheSessionDAO或类似实现,以便使用getActiveSessions()方法
                    Collection<Session> activeSessions = sessionDAO.getActiveSessions(); // 获取所有活动会话
                    if (!CollectionUtils.isEmpty(activeSessions)) {
                        for (Session session : activeSessions) {
                            OAUser oaUser = (OAUser) session.getAttribute("OA_USER_INFO");
                            if (null != oaUser && oaUser.getUserName().equals(username)) {
                                logger.info("用户 {} 被下线,session Id={}", username, session.getId());
                                SessionKey sessionKey = new DefaultSessionKey(session.getId());
                                defaultSessionManager.stop(sessionKey);
                            }
                        }
                    } else {
                        logger.warn("No active sessions found.");
                    }
                } else {
                    logger.warn("The SessionDAO is not an instance of EnterpriseCacheSessionDAO.");
                }
            } else {
                logger.warn("The SessionManager is not an instance of DefaultSessionManager.");
            }
        } else {
            logger.warn("The SecurityManager is not an instance of DefaultSecurityManager.");
        }
    }

    /**
     * 自己下綫
     */
    public static void logout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值