首先,我们要说明一下,本技术点的开发背景是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. Altium Designer 10如何导出SMT加工信息和BOM元件清单

    要委托工厂进行SMT加工,需要向工厂提供表贴元器件的位置信息(Pick Place),这些信息可以由csv保存下来. 步骤如下: 一.设定坐标原点,一般设为板子左下角,在Keepout划线的顶点处. ...

  2. [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参

    个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...

  3. 常用的phpdoc标签

    标签 说明 @access public|private|protected 描述了访问级别.当使用反射技术时,这个标签不是很有用,这是因为API能够自动获取这一特性.在PHPDoc中,用它可略去私有 ...

  4. Linux 的基本命令

    Linux 的基本命令 1. 文件操作 a) Windows 是多根的文件系统,物理上是 1 到多块硬盘,逻辑上分为 C.D.E……盘, 每个盘都是一棵树.Linux 是单根的文件系统,不分 CDE ...

  5. 最详细最权威的Android 编码规范

    1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 1.1 术语说明 在本文 ...

  6. 多系统引导 Grub

    目录 1. 多系统引导程序 1.1 简介 1.2 Grub History 1.3 支持Windows系统下安装的grub版本 1.4多系统引导程序对比: 1.5 相关参考 1.5.1 Grub 2 ...

  7. C++实现简单学生管理系统

    在网上看到的一个C++的小项目,我自己码了一遍,然后记录下我的理解以及像我这种菜鸟在整个过程中产生的问题. 我将我知道的尽可能详细的写下来,如有错误请联系我哈,QQ:920209178. 原文地址:h ...

  8. 让你真正了解Java(纯干货)

    “你学习一门技术的最佳时机是三年前,其次是现在.”这句话对于哪一种行业都很适用,如果你已经学习过Java,那么恭喜你你很有先见之明,如果你并不了解Java,这篇文章带你快速掌握Java的几个核心知识点 ...

  9. 文件IO 相关的包:java.io文件——API

    文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...

  10. vue重温之mint-ui------------点击事件绑定

    第一次接触mint-ui,在使用它的tabbar时,为了达到点击切换页面的效果,采用了点击事件的方式,然后就碰到了这么个问题: 是的,点击事件是不起作用的. 然后刚好一个朋友也在做这块,而且有一段时间 ...