【Shiro】第三章 Shiro入门(一)

简介: 【Shiro】第三章 Shiro入门

1、身份认证

【1】基本流程

流程如下:

1、Shiro把用户的数据封装成标识token,token一般封装着用户名,密码等信息

2、使用Subject门面获取到封装着用户的数据的标识token

3、Subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager把标识token委托给认证器Authenticator进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm

4、认证器Authenticator将传入的标识token,与数据源Realm对比,验证token是否合法

【2】案例演示

【2.1】需求

1、使用shiro完成一个用户的登录

【2.2】实现

【2.2.1】新建项目

shiro-day01-01authenticator

【2.2.2】导入依赖

1. <?xml version="1.0" encoding="UTF-8"?>
2. 
3. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5. <modelVersion>4.0.0</modelVersion>
6. 
7. <groupId>com.itheima.shiro</groupId>
8. <artifactId>shiro-day01-01authenticator</artifactId>
9. <version>1.0-SNAPSHOT</version>
10. 
11. <name>shiro-day01-01authenticator</name>
12. <!-- FIXME change it to the project's website -->
13. <url>http://www.example.com</url>
14. 
15. <properties>
16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17. </properties>
18. 
19. <dependencies>
20. 
21. <dependency>
22. <groupId>commons-logging</groupId>
23. <artifactId>commons-logging</artifactId>
24. <version>1.1.3</version>
25. </dependency>
26. 
27. <dependency>
28. <groupId>org.apache.shiro</groupId>
29. <artifactId>shiro-core</artifactId>
30. <version>1.3.2</version>
31. </dependency>
32. 
33. <dependency>
34. <groupId>junit</groupId>
35. <artifactId>junit</artifactId>
36. <version>4.11</version>
37. </dependency>
38. 
39. </dependencies>
40. 
41. <build>
42. <plugins>
43. <!-- compiler插件, 设定JDK版本 -->
44. <plugin>
45. <groupId>org.apache.maven.plugins</groupId>
46. <artifactId>maven-compiler-plugin</artifactId>
47. <version>3.1</version>
48. <configuration>
49. <source>8</source>
50. <target>8</target>
51. <showWarnings>true</showWarnings>
52. </configuration>
53. </plugin>
54. </plugins>
55. </build>
56. </project>

【2.2.3】编写shiro.ini

1. #声明用户账号
2. [users]
3. jay=123

【2.2.4】编写HelloShiro

1. package com.itheima.shiro;
2. 
3. import org.apache.shiro.SecurityUtils;
4. import org.apache.shiro.authc.UsernamePasswordToken;
5. import org.apache.shiro.config.IniSecurityManagerFactory;
6. import org.apache.shiro.mgt.SecurityManager;
7. import org.apache.shiro.subject.Subject;
8. import org.apache.shiro.util.Factory;
9. import org.junit.Test;
10. 
11. /**
12.  * @Description:shiro的第一个例子
13.  */
14. public class HelloShiro {
15. 
16. @Test
17. public void shiroLogin() {
18. //导入权限ini文件构建权限工厂
19.         Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
20. //工厂构建安全管理器
21. SecurityManager securityManager = factory.getInstance();
22. //使用SecurityUtils工具生效安全管理器
23.         SecurityUtils.setSecurityManager(securityManager);
24. //使用SecurityUtils工具获得主体
25. Subject subject = SecurityUtils.getSubject();
26. //构建账号token
27. UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jay", "123");
28. //登录操作
29.         subject.login(usernamePasswordToken);
30.         System.out.println("是否登录成功:" + subject.isAuthenticated());
31.     }
32. }

【2.2.4】测试

【2.3】小结

1、权限定义:ini文件

2、加载过程:

   导入权限ini文件构建权限工厂

   工厂构建安全管理器

   使用SecurityUtils工具生效安全管理器

   使用SecurityUtils工具获得主体

   使构建账号token用SecurityUtils工具获得主体

   构建账号token

   登录操作

2、Realm

【1】Realm接口

所以,一般在真实的项目中,我们不会直接实现Realm接口,我们一般的情况就是直接继承AuthorizingRealm,能够继承到认证与授权功能。它需要强制重写两个方法

1. public class DefinitionRealm extends AuthorizingRealm {
2. 
3. /**
4.   * @Description 认证
5.   * @param authcToken token对象
6.   * @return 
7.   */
8.  public abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {
9. return null;
10.     }
11. 
12.   /**
13.    * @Description 鉴权
14.    * @param principals 令牌
15.    * @return
16.    */
17.   public abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){
18. return null;
19.     }
20. }

【2】自定义Realm

【2.1】需求

1、自定义Realm,取得密码用于比较

【2.2】实现

【2.2.1】创建项目

shiro-day01-02realm

【2.2.2】定义SecurityService

SecurityService

1. package com.itheima.shiro.service;
2. 
3. /**
4.  * @Description:权限服务接口
5.  */
6. public interface SecurityService {
7. 
8. /**
9.      * @Description 查找密码按用户登录名
10.      * @param loginName 登录名称
11.      * @return
12.      */
13.     String findPasswordByLoginName(String loginName);
14. }

SecurityServiceImpl

1. package com.itheima.shiro.service.impl;
2. 
3. import com.itheima.shiro.service.SecurityService;
4. 
5. /**
6.  * @Description:权限服务层
7.  */
8. public class SecurityServiceImpl implements SecurityService {
9. 
10. @Override
11. public String findPasswordByLoginName(String loginName) {
12. return "123";
13.     }
14. }


相关文章
|
小程序
小程序wx.switchTab的跳转传参问题
小程序wx.switchTab的跳转传参问题
480 0
Echarts线性渐变、径向渐变、纹理填充
Echarts线性渐变、径向渐变、纹理填充
|
jenkins 测试技术 持续交付
Jenkins从节点上构建自动化测试项目时报错:java.io.IOException: Unexpected termination of the channel
在mac电脑上配置了Jenkins从节点,在该从节点上构建app UI 自动化测试项目,运行一些用例后报如下错误:
|
网络协议 NoSQL Java
Jedis介绍及常见问题分析
本文主要介绍Jedis的使用方法及常见问题的排查分析方法
13341 1
|
人工智能 PyTorch 算法框架/工具
PyTorch 人工智能研讨会:1~5
PyTorch 人工智能研讨会:1~5
231 0
|
算法 Java
【编程基础知识】Java打印九九乘法表
本文介绍了在Java中实现九九乘法表的三种方法:嵌套循环、数组和流控制。通过代码示例、流程图和表格对比,帮助读者深入理解每种方法的优缺点,提升编程技能。
660 2
|
SQL 关系型数据库 MySQL
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
885 4
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
数据采集 机器学习/深度学习 测试技术
数据清洗与过滤中,如何确定哪些数据是高质量的?
数据清洗与过滤中,如何确定哪些数据是高质量的?
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
446 3

热门文章

最新文章