文章目录
- 前言
- 一、组件
- 二、主要开发步骤
- 三、常用的API
- 四、认证的流程
前言
在学习之前,让我们先了解一下什么是shiro。
Shiro(Apache Shiro)是一个Java安全框架,提供了身份认证、授权、加密和会话管理等功能。它的设计目标是简单、易用和灵活。
主要是有以下是Shiro框架的主要特点:
1. 身份认证: Shiro提供了多种身份认证方式,包括基于表单、HTTP基本认证、LDAP和OAuth等。开发人员可以根据应用程序需求选择适合的认证方式。
2. 授权管理: 通过Shiro的授权机制,开发人员可以定义用户角色和权限,并通过编程方式或配置文件来限制用户对资源的访问。Shiro支持基于角色和权限的细粒度授权管理。
3. 会话管理: Shiro可以管理用户会话,包括会话的创建、维护和失效处理。它支持不同的会话存储方式,如内存、数据库或自定义存储方式。
4. 密码加密: Shiro提供了密码加密的功能,可以帮助开发人员将用户密码进行加密存储,增加系统的安全性。
5. 可插拔架构: Shiro采用可插拔的设计,开发人员可以根据需要自定义和扩展各个组件,以满足具体业务需求。
6. 简化开发: Shiro的设计理念是简单明确,它提供了简洁的API和易于理解的概念模型,使得开发人员能够快速上手并集成到项目中。
总体而言,Shiro是一个轻量级的安全框架,适用于各种Java应用程序,无论是传统的JavaEE应用还是现代化的Web应用或微服务架构。它提供了身份认证、授权、加密和会话管理等核心功能,同时支持自定义扩展,以满足不同场景下的安全需求。
一、组件
Subject: 主体,可以看到主体可以是任何可以与应用交互的“用户”;
SecurityManager: Shiro的心脏;所有具体的交互都通过SecurityManager进行控制;负责所有Subject、且负责进行认证和授权、及会话、缓存的管理。
Authenticator: 认证器,判断用户是否正常登陆
Authorizer: 授权器,判断用户是否有权限操作资源
Realm: 可以有1个或多个Realm,主要提供认证和授权的数据;
Session: Shiro提供一个权限的企业级Session解决方案,session的生命周期都SessionManager中进行管理。
SessionManager: shiro的会话管理器;
SessionDAO: 用于会话的CRUD,比如存储到ehcache或者redis中的会话增删改查;
CacheManager: 缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能
Cryptography: 密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密的。
二、主要开发步骤
使用Shiro开发一个基本的身份认证和授权功能,可以按照以下主要步骤进行:
1. 引入依赖: 在项目中引入Shiro框架的相关依赖,可以通过Maven或Gradle进行管理。
2. 配置Shiro: 创建Shiro的配置文件(通常是一个ini或Properties文件),配置Shiro的各个组件和属性,例如Realm、Session管理器、加密算法等。
3. 实现自定义Realm: 根据实际需求,实现自定义的Realm类。Realm负责从数据源(如数据库)中获取用户信息和权限信息,并对其进行验证和授权。
4. 编写身份认证代码: 在应用程序中编写身份认证的代码,通过Shiro提供的API调用对用户输入的凭据(如用户名和密码)进行认证,并获取用户相关的信息。
5. 编写授权代码: 根据需要编写授权相关的代码。可以定义角色和权限,并使用Shiro提供的API检查用户是否具有特定的角色或权限。
6. 在应用程序中集成Shiro: 根据框架和应用类型的不同,将Shiro集成到应用程序中。这可能涉及到配置过滤器链(Web应用)、添加AOP切面(Spring应用)或其他集成方式。
7. 测试和调试: 运行应用程序,并进行测试和调试以确保身份认证和授权功能正常工作。
8. 高级功能和定制化: 根据具体需求,探索Shiro的更高级功能和自定义扩展点。这可能涉及到基于注解的权限控制、密码加密、多Realm支持等。
三、常用的API
#获取当前用户
Subject currentUser = SecurityUtils.getSubject();
#判断用户已经认证
currentUser.isAuthenticated()
#用户登录凭证
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
#记住我
token.setRememberMe(true);
#登陆校验
currentUser.login(token);
#判断是否有角色权限
currentUser.hasRole("schwartz")
#判断是否有资源操作权限
currentUser.isPermitted("lightsaber:wield")
#登出
currentUser.logout();
其中有主要的:
1.认证
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
currentUser.login(token);
currentUser.logout();
2.判断权限
currentUser.hasRole("schwartz")
currentUser.isPermitted("winnebago:drive:eagle5")
四、认证的流程
Shiro 是一个用于身份验证、授权、加密和会话管理的框架。相比其他安全框架,Shiro 简单易用,非常适合中小型项目,下面是 Shiro 的认证流程:
1. 构建 SecurityManager 对象:
Shiro 的所有安全操作都基于 SecurityManager 进行,因此首先要创建一个 SecurityManager 对象。
2. 构建 AuthenticationToken 对象:
身份验证的第一步是获取用户提交的身份凭证(AuthenticationToken)。凭证通常包含用户名和密码。
3. 身份验证:
SecurityManager 获得凭证后,将其传递给 Authenticator 对象进行身份验证。Authenticator 对象将尝试使用这些凭证来验证用户的身份。
4. 构建 Subject 对象:
如果身份验证成功,将使用 Subject 对象表示已经身份验证的用户,Subject 包含用户的身份信息以及与该用户相关的授权信息。
5. 授权:
一旦用户被身份验证并已经创建了 Subject 对象,就可以使用 Subject 进行授权操作。授权通常包含用户角色和访问权限。
总的来说,Shiro 的身份验证流程非常简单,只需要通过 SecurityManager 对象、身份凭证、Authenticator 对象、Subject 对象和授权即可完成。内容可能比较简单,但是 Shiro 在整个 Java 安全框架中扮演着重要的角色。