权限管理 第1课 Shiro最简demo

权限管理 第1课 Shiro最简demo


权限管理 第1课 Shiro最简demo
权限管理 第2课 Shiro登录的源码解析


目标:
  本次项目实现的目标就是使用shiro登录登出成功,存储的用户密码是读取的配置文件的。

1. 开发流程
2. 具体编程步骤
3. 简要解析

1. 开发流程

  1. 创建项目,导入依赖
  2. 创建配置文件shiro.ini
  3. 创建测试登录的方法
    1. 创建SecurityManagerFactory对象
    2. 通过工厂对象创建SecurityManager对象
    3. 将SecurityManager绑定到当前环境
    4. 创建当前登录的主体
    5. 收集主体登录的身份/凭证,即账号密码
    6. 主体登录,并根据抛出的异常判断登录失败原因
    7. 判断是否登录成功
    8. 登出(注销)当前主体

2. 具体编程步骤

 1. 创建项目,导入依赖

  创建一个简单的jar的maven项目,并导入如下依赖:
在这里插入图片描述
  完整的pom.xml文件内容,导入三个依赖

<?xml version="1.0" encoding="UTF-8"?>
<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.tqazy</groupId>
    <artifactId>shiro</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <name>shiro</name>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- 待会儿需要测试的依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- shiro需要的日志依赖 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
        <!-- shiro核心依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.2.2</version>
        </dependency>
    </dependencies>
</project>

2. 创建配置文件shiro.ini

  在项目结构的main文件夹下,创建资源文件夹:resources,并创建文件shiro.ini,写入如下文件内容,待测试使用(模拟从数据库读出):

[users]
# 模拟数据库用户列表:账号=密码
zhangsan=666
lisi=888

3. 创建测试登录的方法

  在项目结构的test文件夹里的java测试源文件夹下,创建测试类:ShiroTest
在这里插入图片描述

1. 测试类的具体代码如下

package com.tqazy;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
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;
import org.junit.Test;

/*
    UnknownAccountException:找不到用户异常
    IncorrectCredentialsException:账号正确,密码错误异常
 */

/**
 * 测试Shiro认证
 */
public class ShiroTest {

    @Test
    public void testLogin() throws Exception{
        // 1. 创建出SecurityManager工厂对象
        Factory<SecurityManager> factory =  new IniSecurityManagerFactory("classpath:shiro.ini");
        // 2. 通过工厂对象,创建SecurityManager对象
        SecurityManager securityManager = factory.getInstance();
        // 3. 将securityManager绑定到当前运行环境中,让系统随时随地都可以访问securityManager对象
        SecurityUtils.setSecurityManager(securityManager);

        // 4. 创建当前登录的主体
        Subject subject = SecurityUtils.getSubject();

        // 5. 收集主体登录的身份/凭证,即账号密码(一般是前端传入的)
        // 参数1:将要登录的用户名;参数2:将要登录的密码
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan1","666");

        try {
            // 6. 主体登录
            subject.login(token);
        } catch (UnknownAccountException e){
            System.out.println("没有当前用户");
        } catch (IncorrectCredentialsException e){
            System.out.println("密码错误");
        }

        // 7. 判断登录是否成功
        System.out.println("验证登录是否成功:" + subject.isAuthenticated());

        // 8. 登出(注销)
        subject.logout();
        System.out.println("是否登出状态:" + !subject.isAuthenticated());
    }
}

2. 执行

  通过改变测试类中的账号密码和shiro.ini中配置的账号密码的不同,返回的结果也是不同的:

输入:zhangsan、666
结果:
	验证登录是否成功:true
	是否登出状态:true
输入:zhangsan1、666
结果:
	没有当前用户
	验证登录是否成功:false
	是否登出状态:true
输入:zhangsan、6661
结果:
	密码错误
	验证登录是否成功:false
	是否登出状态:true

3. 简要解析

1. Shiro三个核心概念

1. Subject:
  与当前软件交互的东西,可以是人、系统或者第三方程序等等,提供登录、登出等等的方法的API
  当我们登录系统输入账号密码时,我们就是主体;当系统执行定时任务需要权限登录时,自动登录系统账号去获取权限则是此时的主体就是系统。之所以系统执行也要认证的原因是目标方法或者Shiro无法判别请求的数据流是来自人的操作还是系统或者恶意程序等等的操作,所以即使系统访问受限资源也是需要认证授权的,这样比较安全。

2. SecurityManager:
  安全管理器,管理所有用户的安全操作
  Subject提供的登录、登出等等的方法都是SecurityManager提供的实现。是Shiro最重要的功能实现核心,我们在上面创建了SecurityManager的工厂,通过工厂创建了SecurityManager对象,并绑定到当前运行环境,供随时随地访问

3. Realms:
  充当了Shiro与应用安全数据间的“桥梁”或者“连接器”,当与像用户帐户这类安全相关数据进行交互,执行认证(登录)和授权(访问控制)时,Shiro会从应用配置的Realm中查找很多内容。
  Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。(具体的理解后面再说,本项目对Realms的实现就是shiro.ini文件)

三个概念的关系图
在这里插入图片描述Shiro简易结构图
本部分解析摘录自博客园的如若的博客,在此声明
在这里插入图片描述解析:
  1. Authentication: 身份验证,最直白的理解就是负责登录;
  2. Authorization: 授权,访问控制的过程,允许用户去访问它可以访问的资源;
  3. Session Management: 会话管理,管理用户特定的会话;
  4. Cryptography: 加密,通过使用加密算法保持数据的安全同时易于使用;
以上4个部分Shiro的基础四个核心部分

  • Web Support:Shiro的web支持的API能够轻松地帮助保护 Web 应用程序。
  • Caching:缓存是Apache Shiro中的第一层公民,来确保安全操作快速而又高效。
  • Concurrency:Apache Shiro利用它的并发特性来支持多线程应用程序。
  • Testing:测试支持的存在来帮助你编写单元测试和集成测试,并确保你的能够如预期的一样安全。
  • Run As:一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
  • Remember Me:在会话中记住用户的身份,所以他们只需要在强制时候登录。

我会在第2课中为大家深入的剖析Shiro登录的源码

如果本文有错误或对本文有不理解的地方欢迎评论 ^_^
如果本文有帮助到您,可以点一下右上角的赞哦,谢谢啦

发布了39 篇原创文章 · 获赞 19 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_35394434/article/details/103362939