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, 加入以下内容:

  1. <filter-name>ShiroFilter</filter-name>
  2. <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
  3. <init-param>
  4. <param-name>configPath</param-name>
  5. <param-value>/WEB-INF/shiro.ini</param-value>
  6. </init-param>
  7. </filter>

2. shiro.ini简单示例(ini配置中主要配置有四大类:main,users,roles,urls,这儿先介绍下main,其他三个后面介绍)

  1. [main]
  2. jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
  3. dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
  4. #数据库驱动
  5. dataSource.driverClass=com.mysql.jdbc.Driver
  6. #数据库名
  7. dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
  8. #数据库登入名 其中user是包里的固定写法
  9. dataSource.user=root
  10. #数据库密码
  11. dataSource.password=123456
  12. #设置数据源
  13. jdbcRealm.dataSource=$dataSource
  14. securityManager.realms=$jdbcRealm

源码案例 ,链接数据库测试

整体结构如下图:

    

先导入jar包,我用的是maven环境,看详情:

  1. <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">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.java123.shiro</groupId>
  4. <artifactId>Shior001</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <name>Shiro001</name>
  7. <build/>
  8. <!-- 自动下载jar配置到本地仓库 maven Dependcies -->
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.apache.shiro</groupId>
  12. <artifactId>shiro-core</artifactId>
  13. <version>1.2.4</version>
  14. </dependency>
  15. <!-- 下载jar包 -->
  16. <dependency>
  17. <groupId>org.slf4j</groupId>
  18. <artifactId>slf4j-log4j12</artifactId>
  19. <version>1.7.12</version>
  20. </dependency>
  21.  
  22. <!-- 下载同上 -->
  23. <dependency>
  24. <groupId>c3p0</groupId>
  25. <artifactId>c3p0</artifactId>
  26. <version>0.9.1.2</version>
  27. </dependency>
  28.  
  29. <dependency>
  30. <groupId>c3p0</groupId>
  31. <artifactId>c3p0</artifactId>
  32. <version>0.9.1.2</version>
  33. </dependency>
  34.  
  35. <dependency>
  36. <groupId>commons-logging</groupId>
  37. <artifactId>commons-logging</artifactId>
  38. <version>1.2</version>
  39. </dependency>
  40.  
  41. <!-- mysql的驱动包 -->
  42. <dependency>
  43. <groupId>mysql</groupId>
  44. <artifactId>mysql-connector-java</artifactId>
  45. <version>5.1.37</version>
  46. </dependency>
  47.  
  48. </dependencies>
  49. </project>

之后会自动生成jar包文件

    

然后编写shiro.xm配置文件,代码参见shior.xml文件详解,再引入log4g文件,以便查看信息

最后写一个测试类,查看折叠代码

  1. import org.apache.shiro.SecurityUtils;
  2. import org.apache.shiro.authc.AuthenticationException;
  3. import org.apache.shiro.authc.UsernamePasswordToken;
  4. import org.apache.shiro.config.IniSecurityManagerFactory;
  5. import org.apache.shiro.mgt.SecurityManager;
  6. import org.apache.shiro.subject.Subject;
  7. import org.apache.shiro.util.Factory;
  8.  
  9. public class JdbcRealm {
  10.  
  11. public static void main(String[] args) {
  12.  
  13. //读取配置文件,初始化工厂
  14. Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:jdbc_realm.ini");
  15.  
  16. //获取SecurityManager实例
  17. SecurityManager secManager=factory.getInstance();
  18.  
  19. //把secManager绑定到SecurityUtils中
  20. SecurityUtils.setSecurityManager(secManager);;
  21.  
  22. //得到当前执行的用户
  23. Subject subject=SecurityUtils.getSubject();
  24.  
  25. //创建token令牌,用户名和密码
  26. //其中"java1234","123456"是写死的,与shiro.ini里面的一致
  27. UsernamePasswordToken token=new UsernamePasswordToken("java1234","123456");
  28.  
  29. try {
  30. subject.login(token); //身份异常处理
  31. System.out.println("身份登入成功");
  32. } catch (AuthenticationException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. System.out.println("身份登入失败");
  36. }
  37. //Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
  38. //退出
  39. subject.logout();
  40. }
  41. }

最后看看运行结果:

自学到这,分享出来。希望对入门的朋友也有用,技术交流,欢迎添加(QQ:1030570138)

后续...

Shiro学习笔记总结,附加" 身份认证 "源码案例(一)的更多相关文章

  1. [shiro学习笔记]第四节 使用源码生成Shiro的CHM格式的API文档

    版本号为1.2.3的shiro API chm个事故文档生成. 获取shiro源码 编译生成API文档 转换成chm格式 API 获取shiro源码 shiro官网: http://shiro.apa ...

  2. Django:学习笔记(9)——用户身份认证

    Django:学习笔记(9)——用户身份认证 User

  3. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  4. Kali学习笔记30:身份认证与命令执行漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 实验环境: Kali机器:192.168.163.13 ...

  5. 并发编程学习笔记(七、Thread源码分析)

    目录: 常见属性 构造函数 start() run() 常见属性: /** * 线程名称 */ private volatile String name; /** * 线程优先级 */ private ...

  6. Android学习笔记_48_若水新闻客户端源码剖析

    一.新闻客户端布局代码 1.1 主界面布局 使用GridView实现左右可滑动菜单项,使用标签HorizontalScrollView实现水平滚动条,将创建的GridView添加到布局文件中. < ...

  7. shiro学习笔记_0200_认证

    认证,身份验证,验证用户是否合法 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份: principals:用户的身份信息 ...

  8. shiro学习笔记_0600_自定义realm实现授权

    博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...

  9. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

随机推荐

  1. C语言处理CSV数据

    以下代码为博客 <Python的并行求和例子>: http://www.cnblogs.com/instant7/p/4312786.html 中并行python代码的C语言重写版. 用C ...

  2. Node安装配置

    下载安装nodejs后进行如下配置: 修改模块安装位置和缓存位置在要存放的位置手动新建全局目录node_global在要存放的位置手动新建缓存目录node_cache执行如下命令:npm config ...

  3. 小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理

    笔记 7.Eureka服务注册中心配置控制台问题处理     简介:讲解服务注册中心管理后台,(后续还会细讲) 问题:eureka管理后台出现一串红色字体:是警告,说明有服务上线率低 EMERGENC ...

  4. 分布式存储ceph部署(2)

    一.部署准备: 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用:     1台部署节点(配一块硬盘,运行ceph-depo ...

  5. 基于scrapy框架的爬虫

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. scrapy 框架 高性能的网络请求 高性能的数据解析 高性能的 ...

  6. Java内部类(2):普通的成员内部类

    在成员内部类中要注意两点 第一:成员内部类中不能存在任何static的变量和方法: 第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类. 接下来是两个例子(关键字:.this . ...

  7. 用shader实现流动的水面(webgl)

    这段时间一直在看如何用shader绘制一个流动的水面,直接用贴图(高度图.法向贴图)实现的方法,这里就不讨论了. 搜了一大波博客资料,感觉存在如下一些问题: 1⃣️大多数资料都是基于opengl实现( ...

  8. python基础知识(集合)

    集合 可变集合set()/不可变集合frozenset() {}  大写的拉丁字母 用于保存不重复元素.无序不能通过索引来获取 集合的创建 空集合 使用set()函数 变量名 = set() 集合的添 ...

  9. 【算法集中营】CRC16 三种算法及c实现

    标准CRC生成多项式如下表: 名称       生成多项式             简记式*  标准引用    CRC-4       x4+x+1                  3        ...

  10. SQL ----- JDBC 用ID查询某条记录

    package demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...