Shiro 安全框架(一)

Shiro 安全框架(一)

什么是安全框架?

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

Shiro简介

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

框架组成

图解:

20211125201227

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

  • 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 获取认证信息
posted @ 2021-12-28 23:45  CN_DADA  阅读(94)  评论(0编辑  收藏  举报