public class LoginTest {

@Test

public void testLogin(){

//1.获取SecurityManager工厂,使用初始化文件初始化测试用户

Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");

//2.创建SecurityManager实例,并绑定到SecurityUtils上面

SecurityManager securityManager=factory.getInstance();

SecurityUtils.setSecurityManager(securityManager);

//3.通过SecurityUtils可以获得Subject

Subject subject=SecurityUtils.getSubject();

//在Subject可以获得登录的用户名的用户密码,创建一个访问令牌

UsernamePasswordToken token=new UsernamePasswordToken("LV",123+"");

//身份验证

subject.login(token);

System.out.println("session===="+subject.getSession());

//测试是否登录

Assert.assertTrue(subject.isAuthenticated());

subject.logout();

//Assert.assertTrue(subject.isAuthenticated());

整个过程:

1、首先通过new IniSecurityManagerFactory并指定一个ini配置文件来创建一个SecurityManager工厂;

2、接着获取SecurityManager并绑定到SecurityUtils,这是一个全局设置,设置一次即可;

3、通过SecurityUtils得到Subject,其会自动绑定到当前线程;如果在web环境在请求结束时需要解除绑定;然后获取身份验证的Token,如用户名/密码;

4、调用subject.login方法进行登录,其会自动委托给SecurityManager.login方法进行登录;

5、如果身份验证失败请捕获AuthenticationException或其子类,常见的如: DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如“用户名/密码错误”而不是“用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;

6、最后可以调用subject.logout退出,其会自动委托给SecurityManager.logout方法退出。

从如上代码可总结出身份验证的步骤:

1、收集用户身份/凭证,即如用户名/密码;

2、调用Subject.login进行登录,如果失败将得到相应的AuthenticationException异常,根据异常提示用户错误信息;否则登录成功;

3、最后调用Subject.logout进行退出操作。

如上测试的几个问题:

1、用户名/密码硬编码在ini配置文件,以后需要改成如数据库存储,且密码需要加密存储;

2、用户身份Token可能不仅仅是用户名/密码,也可能还有其他的,如登录时允许用户名/邮箱/手机号同时登录。

身份认证流程

流程如下:

1、首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtils. setSecurityManager()设置;

2、SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;

3、Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现;

4、Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证;

5、Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问。

}

}

转载于:https://www.cnblogs.com/LvLoveYuForever/p/6207947.html

shrio初体验(1)相关推荐

  1. shrio初体验(2)Realm

    Realm:域,Shiro从从Realm获取安全数据(如用户.角色.权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法:也需 ...

  2. 苹果电脑安装python3密码_mac系统安装Python3初体验

    前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...

  3. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  4. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  5. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...

  6. 用鸿蒙跑了个 “hello world”!鸿蒙开发初体验

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | https://my.oschina.net/u ...

  7. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

  8. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)

    2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...

  9. Spring环境搭建,IoC容器初体验~

    由于最近的任务是关于IoC配置文件格式的转换,所以需要从Spring的IoC容器开始学起,今天根据网上的介绍搭建了Spring环境,并对其IoC容器进行了初体验.文章中涉及到的软件以及推荐的一本关于S ...

最新文章

  1. C++ 函数参数 值传递与引用传递
  2. 使用nginx在Windows部署网站https服务
  3. 字符输入流_Reader类FileReader类介绍
  4. 580分左右的计算机院校,2021年高考580分可以上什么大学 580分左右的院校
  5. 软考考前冲刺第一章计算机硬件基础知识
  6. Liferay MinifierFilter的研究
  7. PyPI 管理员删除已潜伏10个月且下载量超1万次的恶意包
  8. uni-app地址四级联动
  9. php爬虫严选,用 Python 爬取网易严选妹子内衣信息,探究妹纸们的偏好|python爬虫|python入门|python教程...
  10. AWS Landing Zone Solution
  11. U盘格式化导致存储空间变小的解决方法汇总
  12. python基础之语言发展历史
  13. SW软件如果很卡,如何提升速度?
  14. SpringBoot Actuator
  15. Fb广告投放如何代投放
  16. 使用jquery ajax 实现用户的用户名注册验证,如果该用户已存在则提示该用户已存在
  17. 【Android TV】Android 8.0下 ,TV系统通知音失效
  18. 学习、生活、工作心得记录
  19. mysql创表的工种_[MySQL基础]七、连接查询
  20. 计算无线信号的传输距离

热门文章

  1. Mybatis之执行自定义SQL举例
  2. Vue实现点击按钮上下滑动隐藏或展示查询条件
  3. C++ BSS段、数据段、代码段、堆与栈及五大内存分区
  4. 使用Builder模式创建复杂可选参数对象
  5. 关于VSCode更新对于emmet2.0支持的配置更改问题。
  6. python 修行之路(1-自我介绍及python环境的搭建)
  7. spring结合ehcache-spring-annotations配置缓存
  8. JNCIS翻译文档之------接口3
  9. Windows7下安装配置PHP开发环境
  10. 教程和攻略之悪戯極~いたずらリアル~(3D电车监禁)+初回特典