首先,我们要说明一下,本技术点的开发背景是shiro与springMvc结合环境下的开发方式。

  由于shiro把用户登录后的信息都存在了自己封装的session中,所以要实现单一地址登录,我们需要关注到shiro的 session操作。技术实现步骤如下:

一、在shiro的xml配置文件中

1、加入sessionManager配置

    <!-- shiro结合Session会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- session的失效时长,单位毫秒 1小时: 3600000, 站点设置以 6小时 为主:21600000 -->
<!-- 设置全局会话超时时间,默认30分钟,即如果30分钟内没有访问会话将过期 1800000 -->
<property name="globalSessionTimeout" value="1800000"/>
<!-- 删除失效的session -->
<property name="deleteInvalidSessions" value="true"/>
<!-- 是否开启会话验证器,默认是开启的 -->
<property name="sessionValidationSchedulerEnabled" value="true"/>
</bean>

2、在安全管理器中注入session管理器

<!-- securityManager安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="customRealm" />
<!-- 注入缓存管理器 -->
<property name="cacheManager" ref="cacheManager"/>
<!-- 注入session管理器 -->
<property name="sessionManager" ref="sessionManager" />
</bean>

Ps:以上操作针对没有将session管理器注入到安全管理器的同学。因为我们之后需要用到sessionManager,如果没有注入,在运行时会报‘’ServletContainerSessionManager cannot be cast to org.apache.shiro.web.session.mgt.DefaultWebSessionManager‘’错误;

二、在登录的controller中判断重复session,并把他们关闭

1、在controller中写入如下的方法,用于根据当前登录用户,筛选出已登录session中重复登录的信息集合

  /**
*
* @param currentUser 当前登录用户的shiro认证信息
* @return 重复登录的用户Session(shiro格式)
* Description: 遍历同一个账户的现有的session用户信息并将重复的登录缓存信息输出
* @author mylydg
* @date
*/
private List<Session> getLoginedSession(Subject currentUser) {
//获得当前登录用户的全部session
Collection<Session> list = ((DefaultSessionManager) ((DefaultSecurityManager) SecurityUtils
.getSecurityManager()).getSessionManager()).getSessionDAO()
.getActiveSessions();
List<Session> loginedList = new ArrayList<Session>();
Sys_User loginUser = (Sys_User) currentUser.getPrincipal();//获得当前用户信息
for (Session session : list) { Subject s = new Subject.Builder().session(session).buildSubject(); if (s.isAuthenticated()) {
Sys_User user = (Sys_User) s.getPrincipal(); if (user.getLogin_Name().equalsIgnoreCase(loginUser.getLogin_Name())) {
if (!session.getId().equals(
currentUser.getSession().getId())) {
loginedList.add(session);//把除当前登录用户的其他的同名用户session信息加入集合
}
}
}
}
return loginedList;
}

2、在认证登录方法中关闭重复认证的session

@RequestMapping("/login")
public String login(String username,String password,Model model) {
//获取shiro的控制类Subject
Subject subject = SecurityUtils.getSubject();
//获取身份信息
Sys_User cacheUser =(Sys_User)subject.getPrincipal();
if(cacheUser!=null)
{
model.addAttribute("user", cacheUser);
return "sys/user/main";
}
if(username == null) {
return "sys/user/login";
}
//创建一个用于验证用户名和密码的token
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
Sys_User user;
try {
//验证用户名密码
subject.login(token);
//----------------------------关键代码 star--------------------------------------------
//检查当前登录用户信息,将存在重复登录用户信息筛选出来
List<Session> loginedList = getLoginedSession(subject);
for (Session session : loginedList) {
session.stop();//关闭重复用户登录信息缓存
}
//----------------------------关键代码 end--------------------------------------------
//这个方法是获取shiro里面的登录信息,如果reaml里面传入的是对象,这里就是
//对象,如果是字符串,这里就是字符串,按照相应的格式转换使用即可
Object o = subject.getPrincipal();
user = (Sys_User)o;
System.out.println(user.getLogin_Name()+" "+user.getPassword());
model.addAttribute("user", user);
} catch (UnknownAccountException e) {
model.addAttribute("errormessage", "用户名错误!");
System.out.println("userName 用户名错误!");
return "sys/user/login";
} catch (IncorrectCredentialsException e) {
model.addAttribute("errormessage", "密码错误!");
System.out.println("passwd 密码错误");
return "sys/user/login";
}

再次运行系统后,功能实现~

关于shiro安全框架实现同一用户同一时刻仅可在一个地址登录的技术实现的更多相关文章

  1. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  2. (十二)整合 Shiro 框架,实现用户权限管理

    整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...

  3. Shiro安全框架入门篇(登录验证实例详解与源码)

    转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...

  4. Apache Shiro权限框架在SpringMVC+Hibernate中的应用

    在做网站开发中,用户权限必须要考虑的,权限这个东西很重要,它规定了用户在使用中能进行哪 些操作,和不能进行哪些操作:我们完全可以使用过滤器来进行权限的操作,但是有了权限框架之后,使用起来会非常的方便, ...

  5. shiro安全框架

    原文:http://blog.csdn.net/boonya/article/details/8233303 可能大家早先会见过 J-security,这个是 Shiro 的前身.在 2009 年 3 ...

  6. Shiro 权限框架使用总结

    我们首先了解下什么是shiro ,Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨 ...

  7. shiro权限框架

    权限的组成部分:用户 资源 角色 权限 数据库关系表设计是根据自己项目需求设计的 account表role表(id,rolename)account_role(id,aid,rid)permissio ...

  8. shiro权限框架(一)

    不知不觉接触shiro安全框架都快三个月了,这中间配合项目开发踩过无数的坑.现在回想总结下,也算是一种积累,一种分享.中间有不够完美的地方或者不好的地方,希望大家指出来能一起交流.在这里谢谢开涛老师的 ...

  9. Shiro安全框架【快速入门】就这一篇!

    Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™ is a powerful and easy-to-use Java security framework that perfo ...

随机推荐

  1. java类.方法创建.继续调用

    1.ctrl +n 创建类(首字母大写) 2.alt +s 选倒数第二个 创建方法(Superclass) 3.alt +s 选倒数第三个 创建带参数的方法(using fileds) 4.创建的vo ...

  2. ubuntu 16.04 编译安装 amule (开启GUI)

    安装依赖 $ -dev libgeoip-dev zlib1g-dev libupnp-dev libboost-all-dev libwxbase3.-dev libwxgtk3.-dev buil ...

  3. newinstance()和new有什么区别?

    在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别?用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两 ...

  4. JS拖拽div(移动)

    <!doctype html><html><head> <meta charset="utf-8"> <title>JS ...

  5. multi-label image classification:多标签图像分类总结

    多标签图像分类总结 目录 1.简介 2.现有数据集和评价指标 3.学习算法 4.总结(现在存在的问题,研究发展的方向) 简介 传统监督学习主要是单标签学习,而现实生活中目标样本往往比较复杂,具有多个语 ...

  6. Python中的常用魔术方法介绍

    1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初 ...

  7. bzoj 4589 FWT

    #include<bits/stdc++.h> #define ll long long using namespace std; ; ; ; ; <<],b[<< ...

  8. 20165313 《网络对抗技术》 Kali安装

    一.目的要求 下载 安装 网络 共享 软件源 二.主要步骤 我主要是按照最新超详细虚拟机VMware安装Kali Linux 这个方法做的就没有步骤描述了. 安装结果图: 注意事项 安装过程中如果没有 ...

  9. Java Web 学习笔记 1

    Java Web 学习笔记 1 一.Web开发基础 1-1 Java Web 应用开发概述 1.1.1 C/S C/S(Client/Server)服务器通常采用高性能的PC机或工作站,并采用大型数据 ...

  10. 学习笔记CB012: LSTM 简单实现、完整实现、torch、小说训练word2vec lstm机器人

    真正掌握一种算法,最实际的方法,完全手写出来. LSTM(Long Short Tem Memory)特殊递归神经网络,神经元保存历史记忆,解决自然语言处理统计方法只能考虑最近n个词语而忽略更久前词语 ...