Search in sources :

Example 1 with UUser

use of com.pace2car.springbootdemo.shiro.entity.UUser in project springbootquickstart by Pace2Car.

the class ShiroRealm method doGetAuthenticationInfo.

/**
 * 认证
 *
 * @param token
 * @return
 * @throws AuthenticationException
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    logger.info("用户登录,登录信息-->{}", token);
    // 获取用户的输入的账号.
    String username = (String) token.getPrincipal();
    // 通过username从数据库中查找 User对象,如果找到,没找到.
    // 实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
    UUser user = uUserService.getOne(new QueryWrapper<UUser>().eq("username", username));
    logger.info("用户登录,登录信息-->{}", user);
    if (user == null) {
        // 没有返回登录用户名对应的SimpleAuthenticationInfo对象时,就会在LoginController中抛出UnknownAccountException异常
        return null;
    } else {
        user.setLastLoginTime(new Timestamp(System.currentTimeMillis()));
        uUserService.updateById(user);
    }
    SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, user.getPassword(), getName());
    return authenticationInfo;
}
Also used : SimpleAuthenticationInfo(org.apache.shiro.authc.SimpleAuthenticationInfo) QueryWrapper(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) UUser(com.pace2car.springbootdemo.shiro.entity.UUser) Timestamp(java.sql.Timestamp)

Example 2 with UUser

use of com.pace2car.springbootdemo.shiro.entity.UUser in project springbootquickstart by Pace2Car.

the class KickoutSessionControlFilter method onAccessDenied.

/**
 * 表示访问拒绝时是否自己处理,
 * 如果返回true表示自己不处理且继续拦截器链执行,
 * 返回false表示自己已经处理了(比如重定向到另一个页面)。
 */
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
    Subject subject = SecurityUtils.getSubject();
    if (!subject.isAuthenticated() && !subject.isRemembered()) {
        // 如果没有登录,直接进行后面的流程
        return true;
    }
    Session session = subject.getSession();
    // 这里获取的User是实体 因为我在 自定义ShiroRealm中的doGetAuthenticationInfo方法中
    // new SimpleAuthenticationInfo(user, password, getName()); 传的是 User实体 所以这里拿到的也是实体,如果传的是userName 这里拿到的就是userName
    Object principal = subject.getPrincipal();
    String username = ((UUser) principal).getUsername();
    Serializable sessionId = session.getId();
    // 初始化用户的队列放到缓存里
    Cache.ValueWrapper valueWrapper = cache.get(username);
    Deque<Serializable> deque = null;
    if (valueWrapper != null) {
        deque = (Deque<Serializable>) valueWrapper.get();
    }
    if (deque == null) {
        deque = new LinkedList<>();
        cache.put(username, deque);
    }
    // 如果队列里没有此sessionId,且用户没有被踢出;放入队列
    if (!deque.contains(sessionId) && session.getAttribute("kickout") == null) {
        deque.push(sessionId);
    }
    // 如果队列里的sessionId数超出最大会话数,开始踢人
    while (deque.size() > maxSession) {
        Serializable kickoutSessionId = null;
        // 如果踢出后者
        if (kickoutAfter) {
            kickoutSessionId = deque.getFirst();
            kickoutSessionId = deque.removeFirst();
        } else {
            // 否则踢出前者
            kickoutSessionId = deque.removeLast();
        }
        try {
            Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId));
            if (kickoutSession != null) {
                // 设置会话的kickout属性表示踢出了
                kickoutSession.setAttribute("kickout", true);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 如果被踢出了,直接退出,重定向到踢出后的地址
    if (session.getAttribute("kickout") != null) {
        // 会话被踢出了
        try {
            subject.logout();
        } catch (Exception e) {
            e.printStackTrace();
        }
        WebUtils.issueRedirect(request, response, kickoutUrl);
        return false;
    }
    return true;
}
Also used : Serializable(java.io.Serializable) UUser(com.pace2car.springbootdemo.shiro.entity.UUser) Subject(org.apache.shiro.subject.Subject) Session(org.apache.shiro.session.Session) Cache(org.springframework.cache.Cache) DefaultSessionKey(org.apache.shiro.session.mgt.DefaultSessionKey)

Aggregations

UUser (com.pace2car.springbootdemo.shiro.entity.UUser)2 QueryWrapper (com.baomidou.mybatisplus.core.conditions.query.QueryWrapper)1 Serializable (java.io.Serializable)1 Timestamp (java.sql.Timestamp)1 SimpleAuthenticationInfo (org.apache.shiro.authc.SimpleAuthenticationInfo)1 Session (org.apache.shiro.session.Session)1 DefaultSessionKey (org.apache.shiro.session.mgt.DefaultSessionKey)1 Subject (org.apache.shiro.subject.Subject)1 Cache (org.springframework.cache.Cache)1