一、Shiro.ini文件

1.文件说明

①ini(InitializationFile)初始文件:Window系统文件扩展名

②Shiro使用时可以连接数据库,也可以不连接数据库(可以使用shiro.ini配置静态数据)

2.shiro文件组成部分

①[main]:定义全局变量(内置securityManager对象)

②[users]定义用户名和密码

③[roles]定义角色

④[urls]定义哪些内置的urls生效,在web应用时使用

二、Shiro实现认证+Shiro.ini

1.认证过程

学习任何一门新的技术,都是从官网找到get started:http://shiro.apache.org/tutorial.html,My First Shiro Application官网步骤精简版如下:

2.新建module,添加pom依赖

 <properties>
<shiro.version>1.4.1</shiro.version>
<logging.version>1.2</logging.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${logging.version}</version>
</dependency>
</dependencies>

3.resources下新建shiro.ini配置文件并添加如下配置

4.新建test类

  至此、初步实现了结合shiro.ini实现认证过程,下面我分析总结一下

三、源码分析

1、Factory工厂是一个接口,通过查看类结构,看出实现类:IniSecurityFactory(虽然过时不维护,但可用)

2、Subject.login()登录方法,参数也为接口,查看源码类结构,只有唯一实现类:UsernamePasswordToken,只需new该实现类即可

3、当前线程内,多次获取Subject,都是同一个对象

  什么意思?我们测试一下:

在当前线程内,多次从SecurityManager中获取Subject对象,都是同一个对象,底层又是怎么实现的呢?再看一下源码:

①SecurityUtils.getSubject()方法底层做了一些什么?

  从线程上下文中获取Subject,如果为null,建造一个subject并bind到线程上下文

②再看一下ThreadContext.bind(subject)源码

③再看一下put方法做了什么?

④重点来了:resources是什么?ThreadLocal!这下问题就解开了,线程局部变量

四、总结

1、Factory是一个接口,new是其实现类:IniSecurityManagerFactory

2、Subject.login(参数),参数也是AuthenticationToken接口,new的是其唯一实现类,UsernamePasswordToken

3、线程局部变量,每个线程之间的subject是不同对象,线程内subject是同一个对象

  以上内容是我的个人理解,如有误,欢迎大家指正讨论,谢谢

Shiro入门学习之shi.ini实现认证及源码分析(二)的更多相关文章

  1. Shiro入门学习之shi.ini实现授权(三)

    一.Shiro授权 前提:需要认证通过才会有授权一说 1.授权过程 2.相关方法说明 ①subject.hasRole("role1"):判断是否有该角色 ②subject.has ...

  2. Django-restframework 源码之认证组件源码分析

    Django-restframework 源码之认证组件源码分析 一 前言 之前在 Django-restframework 的流程分析博客中,把最重要的关于认证.权限和频率的方法找到了.该方法是 A ...

  3. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

  4. 并发编程学习笔记(8)----ThreadLocal的使用及源码分析

    1. ThreadLocal的理解 ThreadLocal,顾名思义,就是线程的本地变量,ThreadLocal会为每个线程创建一个本地变量副本,使得使用ThreadLocal管理的变量在多线程的环境 ...

  5. Shiro入门学习---使用自定义Realm完成认证|练气中期

    写在前面 在上一篇文章<shiro认证流程源码分析--练气初期>当中,我们简单分析了一下shiro的认证流程.不难发现,如果我们需要使用其他数据源的信息完成认证操作,我们需要自定义Real ...

  6. 【RabbitMQ学习记录】- 消息队列存储机制源码分析

    本文来自 网易云社区 . RabbitMQ在金融系统,OpenStack内部组件通信和通信领域应用广泛,它部署简单,管理界面内容丰富使用十分方便.笔者最近在研究RabbitMQ部署运维和代码架构,本篇 ...

  7. Django rest framework 的认证流程(源码分析)

    一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...

  8. Django REST framework —— 认证组件源码分析

    我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...

  9. Spring Securtiy 认证流程(源码分析)

    当用 Spring Security 框架进行认证时,你可能会遇到这样的问题: 你输入的用户名或密码不管是空还是错误,它的错误信息都是 Bad credentials. 那么如果你想根据不同的情况给出 ...

随机推荐

  1. SDF数据库

    一.SDF数据库初探 SDF是一个标准缩略数据库格式.这个数据库包含扩展名为.sdf的文件并且以结构化文件格式进行数据存储.这些SDF文件通常用于在不同数据库应用之间移动数据.它允许一个用户将一个软件 ...

  2. thinkphp中简单的控制器使用

    1.在路由(route.php)中定义一条路由 Route::rule('new/:name/:id','index/News/read'); 2.在index下的controller控制器中新建一个 ...

  3. iterations 快捷键

    原帖:https://blog.csdn.net/Soinice/article/details/83505198 为了防止删除备份的. iterations 快捷键 Live Templates 其 ...

  4. keil密钥过期 新注册机 有效期至2032年

    点击下载:keil注册机至2032年

  5. pytorch怎么入门学习

    pytorch怎么入门学习 https://www.zhihu.com/question/55720139

  6. php curl请求 header头携带参数

    $headers = array(    'api-key:'.$key,    'authorization:'.$authorization,      ); //初始化    $curl = c ...

  7. Redis非关系型缓存数据库集群部署、参数、命令工具

    <关系型数据库与非关系型数据库> 关系数据库:mysql.oracle.DB2.SQL Server非关系数据库:Redis(缓存数据库).MongodDB(处理海量数据).Memcach ...

  8. 爬虫入门 beautifulsoup库(一)

    先贴一个beautifulsoup的官方文档,https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id12 requ ...

  9. C#中数据类型char*,const char*和string的三者转换

    C#中数据类型char*,const char*和string的三者转换: . const char* 和string 转换 () const char*转换为 string,直接赋值即可. EX: ...

  10. 设置DataGridView的单元格颜色

    RowPrePaint事件: private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArg ...