zoukankan      html  css  js  c++  java
  • Apache Shiro 用户信息保存在session方案

    描述

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

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

    以上三种方法,都可以做到登录成功以后把用户对象存放到session中,但是都没有考虑到一点,使用 保存登录(Remembere) 进行自动登录的情况,以上的几个方法都不会被调用,也没有找到 onRemembereLogin 类似的接口。

    解决方案

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

    代码如下:

    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配置:

    <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 中加上:

    /** = user,userSession

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

  • 相关阅读:
    内存溢出
    接手新业务
    pjb fabu
    中文手册
    人背的时候,做啥都失败
    帮助开发人员学习
    python中的__dict__,__getattr__,__setattr__
    NetCore在Docker中发布及运行
    ELK基础配置
    IdentityServer4 手动验签及日志记录
  • 原文地址:https://www.cnblogs.com/sprinkle/p/6823965.html
Copyright © 2011-2022 走看看