Shiro简介

断了今生、忘了曾经 提交于 2020-03-30 15:01:50

 

Shiro简介

Apache  Shiro是Apache旗下的一个强大易用的Java安全|权限框架,提供了认证、授权、加密和会话管理等功能。

相比于Spring Security,Shiro可能没有 Spring Security 的功能强大,但Shiro相对简单一些。

其实很多时候都不需要十分复杂的安全验证,大部分时候使用短小精悍的Shiro就足够了。

 

 

 

Shiro的功能模块

 

 

  • Authentication:身份认证/登录,验证用户是不是拥有相应的身份
  • Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,比如验证某个用户是否是vip、svip,是否拥有下载文件的权限等等
  • Session Manager:会话(session)管理
  • Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储

这些是主要关心的,常使用的。

 

  • Web Support:Web 支持,使shiro可以集成到 Web 环境
  • Caching:缓存,比如用户登录后,缓存用户信息、拥有的角色/权限,不必每次去数据库查,提高效率
  • Concurrency:shiro支持多线程应用的并发验证,比如在一个线程中开启另一个线程,能自动把权限传播过去
  • Testing:提供测试支持
  • Run As:允许一个用户以另一个用户(如果他们允许)的身份进行访问
  • Remember Me:一次登录后,以后会自动登录,不用再输入账号、密码

这些是shiro提供的特性,根据需要选择使用。

 

shiro 不会自动去维护用户、维护权限,需要我们自己去设计、提供,然后通过相应的接口注入给 shiro 。

 

 

 

 

 

shiro的实现原理

 

在这里插入图片描述

程序代码通过 Subject 来进行认证和授权。 SecurityManager来处理、管理所有Subject的认证、授权; 我们需要给Shiro 的 SecurityManager 注入 Realm,告诉SecurityManager正确的用户信息、授权规则。

 

 

 

 

shiro的架构

 

在这里插入图片描述

 

  • Subject:主体,主体可以是任何可以与应用交互的“用户”
  • SecurityManager :是 Shiro 的核心组件,所有的交互都通过 SecurityManager 进行管理、控制,管理着所有的Subject、负责进行认证和授权,也可以管理会话、缓存

 

  • Authenticator:认证器,负责主体认证。可扩展,如果觉得默认实现不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了
  • Authrizer:授权器,也叫做访问控制器,用来决定Subject是否有权限进行相应的操作,即控制用户能使用应用中的哪些功能
  • Realm:领域,即安全实体数据源,用于获取安全主体。可以有 1 个或多个 Realm。可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等等。Shiro不知道正确的用户信息、权限存储的实现方式、储存位置、内容,所以一般都需要自己来实现Realm

 

  • SessionManager:管理session(会话)
  • SessionDAO:对session中的数据(主要是用户信息、权限)进行持久层操作
  • CacheManager:缓存控制器,用于缓存用户信息、角色、权限等数据。这些数据很少改变,可以放到缓存中,后续使用时从缓存中获取,不必每次都查询数据库,提高效率
  • Cryptography:密码模块,用于数据加密

 

 

 

 

 

Shiro的依赖

在shiro官网可以查看shiro的依赖:

根据需要选择对应的依赖即可。可以点Artifact中的链接下载对应的jar包,也可以使用maven坐标。

 

 

shiro常用的依赖

    <!--shiro的核心模块,是shiro必需的。后面的模块中都已包含了此模块-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--在web项目中使用shiro-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--在servlet中使用shiro,以filter的形式使用-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-servlet-plugin</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--在aspectj项目中使用shiro,以aop的形式使用,此模块提供了shiro相关的注解-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-aspectj</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--在ehcache中使用shiro-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-ehcache</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--在spring中使用shiro-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--在springboot中使用shiro-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-starter</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--在基于springboot的web项目中使用shiro-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.5.1</version>
    </dependency>

 

 

 

 

原文出处

https://blog.csdn.net/pengjwhx/article/details/84867112

在原文的基础上进行了部分增删改

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!