Apache Shiro 用户信息保存在session方案

描述

在使用shiro的时候,常常会有一种需求: 把登陆成功后的用户对象存放到session中,方面其余地方调用。存放到session这个步骤到底应该在哪里去作,有几个地方比较合适:spring

  • 调用 Subject.login() 的时候
  • 使用 cas 进行单点认证的时候,集成 CasFilter 重写 onLoginSuccess() 方法
  • 实现 AuthenticationListener 接口,实现 onSuccess 接口

以上三种方法,均可以作到登陆成功之后把用户对象存放到session中,可是都没有考虑到一点,使用 保存登陆(Remembere) 进行自动登陆的状况,以上的几个方法都不会被调用,也没有找到 onRemembereLogin 相似的接口。数据库

解决方案

在须要用户登陆权限的地方添加一个过滤器: 判断若是用户是登陆状态,而且session里的用户对象为空,则去数据库中查询用户对象放入session中。session

代码以下:app

public class UserSessionFilter extends AccessControlFilter {
  @Override
  protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
      Subject subject = getSubject(request, response);
      if (subject == null) {
          // 没有登陆
          return false;
      }
      HttpSession session = WebUtils.toHttp(request).getSession();
      Object sessionUsername = session.getAttribute(GlobalConstant.SESSION_AUTH_LOGIN_USERNAME);
      if (sessionUsername == null) {
         // 你本身的逻辑
      }
      return true;
  }

  @Override
  protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
      return true;
  }

  @Override
  protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
      return true;
  }
}

spring配置:ide

<bean id="userSessionFilter" class="com.chinamedcom.his.common.auth.UserSessionFilter"/>
<!-- 在ShiroFilterFactoryBean的filters中加入 -->
<property name="filters">
    <util:map>
        <entry key="userSession" value-ref="userSessionFilter"/>
        <!-- ..... -->
        <!-- 你的其余filter -->
    </util:map>
</property>

在 filterChainDefinitions 中加上:ui

/** = user,userSession

本文转载自:https://sqzryang.com/blog/2016/09/22/Apache-Shiro-user-information-stored-in-the-session-plan/?utm_source=tuicool&utm_medium=referralspa

相关文章
相关标签/搜索