Shiro 安全框架

Posted 抽象带狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro 安全框架相关的知识,希望对你有一定的参考价值。

Shiro 安全框架(一)

什么是安全框架?

安全框架主要的作用就是对用户进行身份验证,合法用户的授权,权限的管理等相关安全管理。而目前主流的安全框架有:Shiro 和 Spring Security 两个框架。

Shiro简介

由 Java 开发的安全框架,简单易学,功能强大。

框架组成

图解:

在上图可以看到主要分为三个部分

  • Subject 主体(用户,第三方等与程序对接的会话主体)
  • Security Manager 安全核心(Shrio 的核心功能)
  • Cryptography 密码器(主要用于加密)

而框架最重要的一块就是 Security Manager,这一块主要负责的就是各种权限验证,权限授权,权限管理。。。等安全业务。

第一个用户验证案例(无数据库)

构建 maven 项目,导入 shiro 依赖,并在 resources 下创建 shiro.ini 文件,作为本地数据。

shiro.ini:

[users]
zhangsan=123
xiaohong=45678

TestAutenticator.java:

public class TestAuthenticator 
    public static void main(String[] args) 
        // 1.创建安全管理器 securityManager,可以使用子类 DefaultSecurityManager 来实现。
        DefaultSecurityManager securityManager = new DefaultSecurityManager();

        // 2.给安全管理器配置权限数据 realm,用 IniRealm 来指定 ini 文件
        securityManager.setRealm(new IniRealm("classpath:shiro.ini"));

        // 3.SecurityUtils 使用全局安全管理工具,并指定具体的安全管理器
        SecurityUtils.setSecurityManager(securityManager);

        // 4.关键对象,Subject 主体
        Subject subject = SecurityUtils.getSubject();

        // 5.创建令牌
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");

        // 6.开始验证令牌,由于没有返回值,所以我们需要try。。。catch。。。,如果验证成功则不报错,验证不成功则会报错。
        try
            // 开始验证
            System.out.println("认证状态"+subject.isAuthenticated()); // 查看 subject 的验证状态是否成功
            subject.login(token);
            System.out.println("认证状态"+subject.isAuthenticated()); // 查看 subject 的验证状态是否成功
        catch (IncorrectCredentialsException e)
            e.printStackTrace();
            System.out.println("认证失败:密码错误");
        catch (UnknownAccountException e)
            e.printStackTrace();
            System.out.println("认证失败:用户名错误");
        
    

验证流程分析

主要是分为两个部分:

  • 用户名验证
  • 密码校验

经过源码分析,得出总结:

AuthenticatingRealm 认证realm doGetAuthticationInfo()
AuthorizingRealm 授权realm doGetAuthorizationInfo()

所以我们要实现连接数据库中的数据,那我们的自定义类必须继承一个类——AuthorizingRealm

因为 AuthenticatingRealm 继承了 AuthorizingRealm,并且以上两个方法都是抽象方法,所以我们只要自定义的 Realm 类只要继承 AuthorizingRealm 就可以重写两个方法的具体实现。达到自定义 realm。

AuthorizingRealm 这个抽象类以及它父类(AuthenticatingRealm)给我们提供了两个方法

  • doGetAuthorizationInfo 获取授权信息
  • doGetAuthenticationInfo 获取认证信息

以上是关于Shiro 安全框架的主要内容,如果未能解决你的问题,请参考以下文章

Shiro 安全框架详解一(概念+登录案例实现)

SpringBoot实现基于shiro安全框架的,配合thymeleaf模板引擎的用户认证和授权

Shiro安全框架——快速入门登录拦截用户认证请求授权

权限框架之Shiro详解

Shiro 安全框架

shiro框架入门