关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

java之路 —— 带你了解安全框架Shiro

发布时间:2023-06-27 17:00:50

前言


在学习之前,让我们先了解一下什么是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 安全框架中扮演着重要的角色。


/template/Home/leiyu/PC/Static