lygyh9985825 发表于 2017-12-24 06:05:32

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

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


[*]调用 Subject.login() 的时候
[*]使用 cas 进行单点认证的时候,集成 CasFilter 重写 onLoginSuccess() 方法
[*]实现 AuthenticationListener 接口,实现 onSuccess 接口
  以上三种方法,都可以做到登录成功以后把用户对象存放到session中,但是都没有考虑到一点,使用 保存登录(Remembere) 进行自动登录的情况,以上的几个方法都不会被调用,也没有找到 onRemembereLogin 类似的接口。

解决方案
  在需要用户登录权限的地方添加一个过滤器: 判断如果用户是登录状态,并且session里的用户对象为空,则去数据库中查询用户对象放入session中。
  代码如下:
  

public>@Overrideprotected 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配置:
  

<bean/>  
<!-- 在ShiroFilterFactoryBean的filters中加入 -->
  
<property name="filters">
  <util:map>
  <entry key="userSession" value-ref="userSessionFilter"/>
  <!-- ..... -->
  <!-- 你的其他filter -->
  </util:map>
  
</property>
  

  在 filterChainDefinitions 中加上:
  

/** = user,userSession  

  本文转载自:https://sqzryang.com/blog/2016/09/22/Apache-Shiro-user-information-stored-in-the-session-plan/?utm_source=tuicool&utm_medium=referral
页: [1]
查看完整版本: Apache Shiro 用户信息保存在session方案