Shiro实战教程
1、权限的管理
- 1.1、什么是权限管理
1、基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源
2、权限管理包括用户身份认证
和授权
两部分,简称认证授权
.对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问
- 1.2、什么是身份认证
身份认证就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统。则需出示指纹。对于硬件key等刷卡系统,则需要刷卡。
- 1.3、什么是授权
授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限的则无法进行访问。
2、什么是shrio?
Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.
Shiro是apache旗下的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架
3、shiro的核心架构
subject( org.apache.shiro.subject.Subject) 当前与软件交互的实体(用户、第 3 方服务、cron 作业等)的特定于安全性的“视图”。
SecurityManager ( org.apache.shiro.mgt.SecurityManager ) 如上所述,它SecurityManager是 Shiro 架构的核心。它主要是一个“伞形”对象,用于协调其托管组件以确保它们顺利协同工作。它还管理 Shiro 对每个应用程序用户的视图,因此它知道如何为每个用户执行安全操作。
Authenticator ( org.apache.shiro.authc.Authenticator ) 该Authenticator组件负责执行和响应用户的身份验证(登录)尝试。当用户尝试登录时,该逻辑由Authenticator. Authenticator知道如何与Realms存储相关用户/帐户信息的一个或多个进行协调。从中获得的数据Realms用于验证用户的身份,以确保用户确实是他们所说的人。
身份验证策略( org.apache.shiro.authc.pam.AuthenticationStrategy ) 如果Realm配置了多个,AuthenticationStrategy则将协调领域以确定身份验证尝试成功或失败的条件(例如,如果一个领域成功但其他领域失败,尝试成功了吗?必须所有领域都成功吗?只有第一个?)。
Authorizer ( org.apache.shiro.authz.Authorizer )Authorizer是负责确定用户在应用程序中的访问控制的组件。它是最终决定用户是否被允许做某事的机制。与 一样Authenticator,Authorizer也知道如何与多个后端数据源协调访问角色和权限信息。使用Authorizer此信息来准确确定是否允许用户执行给定的操作。
SessionManager ( org.apache.shiro.session.mgt.SessionManager )SessionManager知道如何创建和管理用户Session生命周期,为所有环境中的用户提供强大的会话体验。这是安全框架领域的一项独特功能——Shiro 能够在任何环境中本地管理用户会话,即使没有可用的 Web/Servlet 或 EJB 容器也是如此。默认情况下,Shiro 将使用现有的会话机制(例如 Servlet Container),但如果没有,例如在独立应用程序或非 Web 环境中,它将使用其内置的企业会话管理来提供相同的编程体验。存在以允许使用SessionDAO任何数据源来持久化会话。
SessionDAO ( org.apache.shiro.session.mgt.eis.SessionDAO )代表. SessionDAO_ 这允许将任何数据存储插入到会话管理基础架构中。SessionSessionManager
CacheManager ( org.apache.shiro.cache.CacheManager )CacheManager创建和管理Cache其他 Shiro 组件使用的实例生命周期。因为 Shiro 可以访问许多后端数据源进行身份验证、授权和会话管理,所以缓存一直是框架中的一流架构特性,可以在使用这些数据源的同时提高性能。任何现代开源和/或企业缓存产品都可以插入 Shiro 以提供快速高效的用户体验。
Cryptography( org.apache.shiro.crypto.* ) 密码学是企业安全框架的自然补充。Shiro 的crypto包包含易于使用和理解的密码、哈希(又名摘要)和不同编解码器实现的表示。这个包中的所有类都经过精心设计,非常易于使用和理解。任何使用过 Java 原生加密支持的人都知道它是一种难以驯服的动物。Shiro 的加密 API 简化了复杂的 Java 机制,并使密码学对普通人来说很容易使用。
Realm( org.apache.shiro.realm.Realm ) 如上所述,领域充当 Shiro 和应用程序安全数据之间的“桥梁”或“连接器”。当需要与安全相关数据(如用户帐户)进行实际交互以执行身份验证(登录)和授权(访问控制)时,Shiro 会从为应用程序配置的一个或多个领域中查找其中的许多内容。您可以根据Realms需要配置任意数量(通常每个数据源一个),Shiro 将根据需要与它们协调以进行身份验证和授权。
4、shiro身份认证
1、认证
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过和对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。
2、shiro 中认证的关键对象
subject 主体
访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体
Principal 身份信息
是主体进行身份认证的标识,标识必须具有唯一性,例如用户名等,一个主体可以有多个身份,但是必须有一个主身份
credential 凭证信息
是只有主体自己指导的安全信息,如密码、证书等
3、认证流程
4、认证开发
- 创建项目并引入依赖
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.9.1</version>
</dependency>
- c创建shiro配置文件
[users]
xiaochen=1235
zhangsan=123567
lisi=123
3. 创建测试文件
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
public class TestAuthenticator {
public static void main(String[] args) {
//1、创建安全管理器对象
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 2、给安全管理器设置realm
securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
// 3、SecurityUtils 全局安全工具类
SecurityUtils.setSecurityManager(securityManager);
//4、关键对象 subject主体
Subject subject = SecurityUtils.getSubject();
// 5、登陆认证创建令牌
AuthenticationToken authenticationToken = new UsernamePasswordToken("xiaochen","1235");
// 5.1、用户认证
try {
System.out.println(subject.isAuthenticated());
subject.login(authenticationToken);
System.out.println(subject.isAuthenticated());
}catch (IncorrectCredentialsException exception){
System.out.print("密码错误");
exception.printStackTrace();
}
catch (Exception c){
c.printStackTrace();
}
}
}
至此,一个简单的shiro权限认证过程已经完成了