首先,我们要说明一下,本技术点的开发背景是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. wps 邮件 通讯小灵通 长沙杭州

    记得在天涯上看过一个热贴,关于贵族与世家的,文中提到号称当今贵族的六大世家,什么“汝南周氏”.“吴兴沈氏”之类,更有甚者,为了比拼,追本溯源,把孔子他老人家也抬了出来,号称孔夫子的多少多少代传人,当时 ...

  2. 数据t转换

    #!/usr/bin/perl use strict; use warnings;    open my $fh,"a.out"; open OUT,">a_t.o ...

  3. log4net使用中loginfo.IsInfoEnabled=false问题解决方法

    引用了其他项目中的日志组件,调试时发现IsInfoEnabled属性一直为false 找了很多的解决办法,都不行 program.cs里面也不用添加 log4net.Config.XmlConfigu ...

  4. mongoDB数据库的安装与配置

    noSql数据库MongoDB的安装地址:https://www.mongodb.com/download-center?jmp=nav#community 选择相应的版本进行下载,在此以window ...

  5. 使用[].forEach.call()方法的写拖拽排序。

    ---恢复内容开始--- }); });}要引用两个插件: <script src="./jquery.1.12.4.min.js"></script> & ...

  6. 文件及文件夹操作- File类、Directory 类、FileInfo 类、DirectoryInfo 类

    文件及文件夹操作: C/S:WinForm可以操作客户端文件 Client ServerB/S:Brower Server 命名空间:using system .IO; 1. File类: 创建:Fi ...

  7. Python练习二

    1.计算 1 - 2 + 3 ... + 99 中除了88以外所有数的总和 sum1 = 0 sum2 = 0 count = 0 while count < 99: count += 1 if ...

  8. git 分支管理记录

    测试环境 :虚拟机(VMware Fusion Centos 6.5) 1.安装git环境 [root@localhost ~]# yum -y install git 2.检测git是否安装成功 [ ...

  9. Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。

    精彩理解:  https://www.jianshu.com/p/21be831e851e ;  https://blog.csdn.net/heyutao007/article/details/19 ...

  10. creator Box2d的相关物理问题

      项目的屏幕配置为 1152*640,没有对这个数值调整来测试质量的除数1024会不会变化 m = h * w / 1024 (m 质量,h 物体高度,w 物体宽度) g = 0, -320 ( ( ...