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
在原文的基础上进行了部分增删改
来源:https://www.cnblogs.com/chy18883701161/p/12596091.html