身份验证

  即在应用中谁能证明他就是他本人。一般提供如他们的身份ID一些标志信息来表明他就是他本人,如提供身份证、用户名、密码来证明

  在shiro中,用户需要提供principals(身份)和credentials(证明)给Shiro,从而应用能验证用户身份;

  principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可,一个主体可以有多个principals,但是只能有一个Primary Principals,一般是用户名、密码/手机号

  credentials:证明/凭证 ,即只有主体知道的安全值,如密码/数字证书等等

  最常见的Principals和Crendentials组合就是用户名/密码组合了。接下来进行一个基本的身份验证

  另外两个相关的概念就是之前提到的Subject和Realm,分别是主体和验证主体的数据源

  一、环境准备

  本文使用Maven构建,因此需要一点Maven知识,首先准备Maven环境依赖

  添加junit、common-logging及shiro-core依赖即可。

  

二、登录、退出

  1、首先准备一些用户/身份凭据(shiro.ini)

此处使用ini配置文件,通过users指定两个主体zhang/123 wang/123

  2、测试用例(com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest)

  

  2.1、首先通过new iniSecurityManagerFactory 并指定一个ini配置文件来创建一个SecuriryManager工厂

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

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

  2.4、调用Subject的login方法进行登录,其会自动委托给SecurityManager.login方法进行登录

  2.5、如果身份验证失败,请捕获AuthenticationException或其子类,常见的如(DesabledAccountException禁用的账号)、lockedAccountException(锁定的账号)、UnkownAccountException(错误的账号) ExcessiveAttemptsException(登录失败次数哦过多)、incorrectCredentialsException(错误的凭证)

ExpiredCredentialsException(过期的凭证) 等,具体请查看继承关系;对于页面的错误消息展示,最好的使用如(用户名、密码错误而不是用户名错误 密码错误),防止一些恶意用户非法扫描账户库。

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

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

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

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

  3、最后调用Subjject.logout方法进行退出

如上测试几个问题

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

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

  三、身份认证流程

  

  流程如下

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

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

  3、Authentication才是真正的身份验证着,Shiro Api中核心的身份认证入口

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

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

  四、Realm

  域:Shiro从Realm中获取安全数据(如用户、角色、权限) ,就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确认用户身份是否合法,也需要从Realm中得到相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成dataSource,即安全数据源,如我们之前的ini配置方式将使用org.apache.shiro.realm.text.IniRealm

  org.apache.shiro.realm.Realm接口如下:

  

  

五、Shiro踢狗默认的Realm

  

  以后一般继承AuthorizingRealm(授权)即可,其继承了AuthenticatingRealm(即身份认证) ,而且也间接继承了CashingRealm(带有缓存实现)。其中主要默认实现如下

  org.apache.shiro.realm.text.iniRealm:[Users]部分指定用户名/密码及其角色;[]roles部分指定角色(即权限信息)

  org.apache.shiro.realm.text.PropertiesRealm:user username=password,role1,role2指定用户名/密码及其角色;role:role1=permission1,permission2指定角色及其权限信息

  org.apache.shiro.jdbc.jdbcRealm:通过sql查询相应的信息如“select password from users where username = ?”获取用户密码,“select password, password_salt from users where username   = ?”获取用户密码及盐;“select role_name from user_roles where username = ?”获取用户角色;“select permission from roles_permissions where role_name = ?”获取角色对应的权限信息;也可以调用相应的api进行自定义sql;

  

  1、变量名 =全限定类名会自动创建一个类实例

  2、变量名.属性 = 值 自动调用相应的setter方法进行赋值

  3、$变量名 引用之前的的一个对象实例

  4、测试代码请参照com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testJDBCRealm方法,和之前的没什么区别。

java开源安全框架-------Apache Shiro--第二天的更多相关文章

  1. java开源安全框架-------Apache Shiro--第一天

    1.1.简介 Apache Shiro 是Java的一个安全框架.目前使用Apache Shiro 的人越来越多,因为它相当简单,对比Spring Security,可能没有没有Spring Secu ...

  2. Java开源爬虫框架crawler4j

    花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...

  3. 【shiro】报错:Caused by: java.lang.ClassNotFoundException: org.apache.shiro.spring.LifecycleBeanPostProcessor

    Caused by: java.lang.ClassNotFoundException: org.apache.shiro.spring.LifecycleBeanPostProcessor at o ...

  4. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

  5. Java开源安全框架之Apache Shiro

    APACHE SHIRO安全框架 1      背景 Shiro项目始于2003年初,当时它叫JSecurity项目,当时对于Java应用开发人员没有太多的安全替代方案,始终被一个叫JAAS(Java ...

  6. Java安全框架 Apache Shiro学习-1-ini 配置

    简单登录流程: 1.  SecurityManager   2.  SecurityUtils.setSecurityManager 3.  SecurityUtils.getSubject     ...

  7. 权限框架Apache Shiro 和 Spring Security

    Shiro 首先Shiro较之 Spring Security,Shiro在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势.Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证.授 ...

  8. java 开源缓存框架--转载

    原文地址:http://www.open-open.com/13.htm  JBossCache/TreeCache  JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的 ...

  9. 使用shiro缓存用户身份信息的时候报:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource

    最近在使用shiro缓存用户的身份信息的时候,报了simpleByteSource不能序列化,跟进源码一看,原来这个类没有实现序列化的接口,但是我在缓存身份信息的实现又要用到这个类,解决方法:重写一个 ...

随机推荐

  1. PHP学习笔记--Php预定义超全局变量$_GET

    Php中的许多预定义变量都是超全局的,无需使用global声明 超全局变量 不需要声明就可以直接使用 提供超全局变量(数组)为了让程序员更快捷的编程 $GLOBALS— 引用全局作用域中可用的全部变量 ...

  2. Django学习-3-请求流程

    Django请求生命周期     -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串     -> URL对应关系(匹配) -> 视图函数 -> 打 ...

  3. 关于游览器网页标题logo的设置

    <link rel="shortcut icon"type="image/x-icon" href="images/favicon.ico&qu ...

  4. freemarker中的left_pad和right_pad(十五)

    freemarker中的left_pad和right_pad 1.简易说明 (1)left_pad 距左边 (2)right_pad 距右边 (3)当仅仅只有一个参数时,插入的是空白:当有两个参数时, ...

  5. jquery初始化的三种方式

    第一种 $(document).ready(function(){ alert("第一种方法."); }); 第二种 $(function(){ alert("第二种方法 ...

  6. 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

    1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...

  7. Python Cookbook(第3版)中文版:15.19 从C语言中读取类文件对象

    15.19 从C语言中读取类文件对象¶ 问题¶ 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案¶ 要读取一个类文件对象的数据,你需要重复调 ...

  8. 【NOIP2015】子串(动态规划)

    题目戳我 题解 很简单的一道题... 看来那时候还是我太菜了... 设f[i][j][k][0/1]表示在第一个串中的位置i,匹配到了位置j,一共分了k段,0/1表示上一个位置是否在某一段中 转移就很 ...

  9. c++面试遇到问题

    1. C 和 C++ 区别      2. const 有什么用途     主要有三点: 1:定义只读变量,即常量 2:修饰函数的参数和函数的返回值 3: 修饰函数的定义体,这里的函数为类的成员函数, ...

  10. 【最新】Power BI混合现实应用Mixed Reality app预览版正式发布

    1.介绍 2018年3月13日,Power BI在官方博客和Docs文档发布了Power BI for Mixed Reality应用预览版的消息, 也就是可以以后在更虚拟的世界中来观察你的报表,想象 ...