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

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

前言


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

目录
相关文章
|
1月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
1月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
1月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
118 8
|
1月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
72 7
|
2月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
1369 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
2月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
189 12
|
3月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
3月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
250 23
|
3月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
3月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
236 12