Shiro学习笔记总结,附加" 身份认证 "源码案例(一)
Shiro学习笔记总结
内容介绍:
一、Shiro介绍
二、subject认证主体
三、身份认证流程
四、Realm & JDBC reaml介绍
五、Shiro.ini配置介绍
六、源码案例 ,链接数据库测试
Apache Shiro™是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速,轻松地确保任何应用程序 - 从最小的移 动应用程序到最大的Web和企业应用程序。
一、subject认证主体
subject:认证主体包含两个信息:
principals:身份,可以是用户名,邮件,手机号邓,用来标志一个登入主体身份
Cresentials:凭证,常见有密码,数字证书等
二、身份认证流程

Step1:应用程序代码在调用Subject.login(token)方法后,传入代表最终用户的身份和凭证构造的AuthenticationToken实例token。
Step2:将Subject实例委托给应用程序的SecurityManager(Shiro的安全管理)通过调用securityManager.login(token)来开始实际的认证工作。这里开始真正的认证工了。
Step3,4,5:然后SecurityManager就会根据具体的reaml去进行安全认证了。
这个realm到底是啥呢?realm就是一个域,Shiro就是从realm中获取验证数据的,也就是我们写在.ini文件中的东西,当然了,这个realm有很多种,如text realm、jdbc realm、jndi realm等,text realm比较简单,这一节主要总结一下jdbc realm的使用,text realm也会提到。
三、Realm & JDBC reaml
Realm 意思是域,shiro从Realm 中获取验证数据
Realm 很多种类,常见有jdbc Realm ,jndi Realm ,text Realm
Shiro默认提供的Reaml说明:
关于说明是Reaml看前面的说明,Shiro默认提供的Reaml说明如下:
一般继承AuthorizingRealm(授权)即可;其继承了AuthenticatingRealm(即身份验证),而且也间接继承了CachingRealm(带有缓存实现)。其中主要默认实现如下:
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.realm.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;
INI配置文件介绍
INI配置文件是一种key/value的键值对配置,提供了分类的概念,每一个类中的key不可重复;
#号代表注释,shiro.ini文件默认在/WEB-INF/ 或classpath下,shiro会自动查找;
INI配置文件一般适用于用户少且不需要在运行时动态创建的情景下使用。
1.在web.xml中配置shiro的过滤器
要使用Shiro必须在web.xml中配置shiro,在web.xml 中自定义shiro.ini位置(默认位置)/WEB-INF/shiro.ini or classpath:shiro.ini, 加入以下内容:
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
<init-param>
<param-name>configPath</param-name>
<param-value>/WEB-INF/shiro.ini</param-value>
</init-param>
</filter>
2. shiro.ini简单示例(ini配置中主要配置有四大类:main,users,roles,urls,这儿先介绍下main,其他三个后面介绍)
[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
#数据库驱动
dataSource.driverClass=com.mysql.jdbc.Driver
#数据库名
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
#数据库登入名 其中user是包里的固定写法
dataSource.user=root
#数据库密码
dataSource.password=123456
#设置数据源
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
源码案例 ,链接数据库测试
整体结构如下图:

先导入jar包,我用的是maven环境,看详情:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.java123.shiro</groupId>
<artifactId>Shior001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Shiro001</name>
<build/>
<!-- 自动下载jar配置到本地仓库 maven Dependcies -->
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.4</version>
</dependency>
<!-- 下载jar包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency> <!-- 下载同上 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency> <dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency> <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency> <!-- mysql的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency> </dependencies>
</project>
之后会自动生成jar包文件

然后编写shiro.xm配置文件,代码参见shior.xml文件详解,再引入log4g文件,以便查看信息
最后写一个测试类,查看折叠代码
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory; public class JdbcRealm { public static void main(String[] args) { //读取配置文件,初始化工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:jdbc_realm.ini"); //获取SecurityManager实例
SecurityManager secManager=factory.getInstance(); //把secManager绑定到SecurityUtils中
SecurityUtils.setSecurityManager(secManager);; //得到当前执行的用户
Subject subject=SecurityUtils.getSubject(); //创建token令牌,用户名和密码
//其中"java1234","123456"是写死的,与shiro.ini里面的一致
UsernamePasswordToken token=new UsernamePasswordToken("java1234","123456"); try {
subject.login(token); //身份异常处理
System.out.println("身份登入成功");
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("身份登入失败");
}
//Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
//退出
subject.logout();
}
}
最后看看运行结果:

自学到这,分享出来。希望对入门的朋友也有用,技术交流,欢迎添加(QQ:1030570138)
后续...
Shiro学习笔记总结,附加" 身份认证 "源码案例(一)的更多相关文章
- [shiro学习笔记]第四节 使用源码生成Shiro的CHM格式的API文档
版本号为1.2.3的shiro API chm个事故文档生成. 获取shiro源码 编译生成API文档 转换成chm格式 API 获取shiro源码 shiro官网: http://shiro.apa ...
- Django:学习笔记(9)——用户身份认证
Django:学习笔记(9)——用户身份认证 User
- 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试
机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...
- Kali学习笔记30:身份认证与命令执行漏洞
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 实验环境: Kali机器:192.168.163.13 ...
- 并发编程学习笔记(七、Thread源码分析)
目录: 常见属性 构造函数 start() run() 常见属性: /** * 线程名称 */ private volatile String name; /** * 线程优先级 */ private ...
- Android学习笔记_48_若水新闻客户端源码剖析
一.新闻客户端布局代码 1.1 主界面布局 使用GridView实现左右可滑动菜单项,使用标签HorizontalScrollView实现水平滚动条,将创建的GridView添加到布局文件中. < ...
- shiro学习笔记_0200_认证
认证,身份验证,验证用户是否合法 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份: principals:用户的身份信息 ...
- shiro学习笔记_0600_自定义realm实现授权
博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...
- Shiro 登录认证源码详解
Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...
随机推荐
- TelephonyUtils
<uses-permission android:name="android.permission.CALL_PHONE"/> import java.util.Arr ...
- JAVA 基础编程练习题14 【程序 14 求日期】
14 [程序 14 求日期] 题目:输入某年某月某日,判断这一天是这一年的第几天? 程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天,特殊情况, 闰年且输入 ...
- Spring-Kafka —— 实现批量消费和手动提交offset
spring-kafka的官方文档介绍,可以知道自1.1版本之后, @KafkaListener开始支持批量消费,只需要设置batchListener参数为true 把application.yml中 ...
- playbook部署coredns
playbook部署coredns 说明test1是主控节点,目的是给test4 node节点安装coredns, 1.coredns-1.2.2.tar.gz安装包放到主控节点/server/sof ...
- Linux详细介绍以及常用命令
Linux系统说明 Linux( 诞生于1991.10.5) 继承了Unix以网络为核心的设计思想, 是一个性能稳定的多用户网络操作系统. Linux这个词严格意义上只表示Linux内核, 但日常中, ...
- 【操作系统】【C/C++开发】内存管理
内存管理 操作系统对内存的划分和动态分配,就是内存管理的概念.有效的内存管理在多道程序设计中非常重要,不仅方便用户使用存储器.提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器.内存管理的功能有: ...
- [转帖]注解机制(Annotation,区别于comment)
[19/04/16-星期二] 注解机制(Annotation,区别于comment(传统意义上的注释)) 一.概念 作用: ——不是程序本身,可以对程序作出解释.(这一点和注释没什么区别) ——可 ...
- centos git clone 报错 fatal: HTTP request failed 解决办法
git clone报错提示 git clone https://github.com/xxxx.git Initialized empty Git repository in /root/xxxx/. ...
- Oracle——学习之路(视图——虚拟表)
语法: create [or replace] view 视图名 as 查询相关语句 ps: or replace 表示新视图可以覆 ...
- java 基础(一)-实验楼
一.标识符:区分大小写由数字.大小写字母.$._ 组成,不能由数字开头.各种变量.方法和类等要素命名时使用的字符序列称.凡是自己可以起名字的地方都叫标识符.不可以使用关键字和保留字,但能包含关键字和保 ...