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 来说要更加 ...
随机推荐
- 【JavaScript】全面解析offsetLeft、offsetTop
假设 obj 为某个 HTML 控件.obj.offsetLeft 指 obj 距离左方或上层控件的位置,整型,单位像素. obj.offsetRight 指 obj 距离右方或上层控件的位置,整型, ...
- springboot2.0+redis实现消息队列+redis做缓存+mysql
本博客仅供参考,本人实现没有问题. 1.环境 先安装redis.mysql 2.springboot2.0的项目搭建(请自行完成),本人是maven项目,因此只需配置,获取相应的jar包,配置贴出. ...
- 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树
一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...
- CRM总结大纲
目录 一. CRM客户关系管理系统 1. CRM是什么? 里面都有哪些功能(业务)? 2. 什么是公户?什么是私户?为什么要做这个区分? 3. 请列举出CRM系统中的表 4. 通过ORM操作对数据库的 ...
- 20190905 - Uncaught SyntaxError: Unexpected token < 的解决
问题:Uncaught SyntaxError: Unexpected token < index:1 原因:js 路径不对
- 部署 --- Docker
Docker学习 介绍 : Docker速度更快.性能更高.操作更易.我们开发的不同的程序APP是需要在操作系统中单独的环境中隔离运行的. 为了能让我们不同的程序可以在隔离的环境中运行:我们可以使用虚 ...
- Mybatis batch 批量处理
@Testpublic void batch() throws IOException { InputStream inputStream= Resources.getResourceAsStream ...
- C语言链表之两数相加
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- Python学习笔记——递归函数
1.设置递归层数 #设置recursion函数的层数,默认是100层 import sys sys.setrecursionlimit(10000) 2. 阶乘 #定义一个阶乘函数 def facto ...
- eclipse 如何从Gitee.com克隆工程到本地,并运行
1.再项目资源管理器里选择导入,导入 2.在导入向导中选择Git,选择来自Git的项目 3.选克隆URL 4.输入URL 和用户密码,点击下一步 4.下一步 5.选择保存路径 6.选择下一步,自动导入 ...