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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 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 安全框架中扮演着重要的角色。

目录
相关文章
|
6天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
27 3
|
2月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
175 3
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
44 4
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
69 2
|
2月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
121 1
|
2月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
58 4
|
2月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
47 0
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
54 0