最新shiro-安全框架
- 格式:doc
- 大小:214.50 KB
- 文档页数:28
shiro反序列化漏洞原理(一)Shiro反序列化漏洞什么是Shiro反序列化漏洞?Shiro是一款Java安全框架,被广泛应用于开发企业级应用程序。
然而,Shiro框架存在一个被称为”Shiro反序列化漏洞”的安全问题。
原理解释1. 什么是序列化和反序列化?在Java中,对象的序列化是指将对象转换为字节流的过程,以便存储或传输该对象。
反序列化则是将字节流转换回对象的过程。
这一过程通常涉及将对象的状态信息写入字节流,以及根据字节流的内容重新构建对象。
2. Shiro框架的对象反序列化漏洞Shiro框架在进行身份认证时,使用了Java的序列化和反序列化机制。
然而,Shiro对于反序列化对象的有效性没有进行足够的验证,导致攻击者可以构造恶意的序列化数据,从而执行任意代码。
攻击者可以通过将恶意的序列化数据提交给Shiro身份认证机制,触发Shiro反序列化漏洞。
一旦攻击成功,攻击者可以在目标服务器上执行恶意代码,进而危害整个应用程序的安全。
漏洞修复与防范措施为了防止遭受Shiro反序列化漏洞的攻击,以下是一些修复和防范措施:1.升级到最新版本的Shiro框架:开发者应及时查看Shiro的官方网站,了解并下载最新版本的Shiro框架。
新版本通常会修复已知的漏洞和安全问题。
2.禁止接受未知的序列化数据:在Shiro的配置中,应禁止接受未知或不受信任的序列化数据。
可以通过配置Shiro的RememberMe功能来限制接受的序列化数据的类型。
3.限制可信任的序列化配置:可以通过在Shiro配置文件中指定可信任的序列化类,来限制序列化和反序列化操作。
只有在白名单中的类才能被反序列化。
4.使用安全的序列化方式:开发者应优先选择安全的序列化方式,如JSON序列化,而不是Java默认的对象序列化。
JSON序列化通常要求开发人员显式地定义序列化和反序列化的过程,从而提高安全性。
5.加强网络安全措施:在服务器层面,加强网络安全措施也是防范Shiro反序列化漏洞的重要措施。
shiro框架工作流程
Shiro框架是一个功能强大的Java安全框架,用于身份验证、授权、加密和会话管理。
它提供了一个简单易用的API,可以帮助开发人员快速地集成安全功能到他们的应用程序中。
下面我们将介绍一下Shiro框架的工作流程。
1. 身份验证(Authentication),Shiro框架首先会对用户进行身份验证,确保用户是合法的。
在身份验证过程中,Shiro框架会检查用户提供的凭证(如用户名和密码)是否与系统中存储的凭证匹配。
如果匹配成功,用户将被授权继续访问系统;否则,将被拒绝访问。
2. 授权(Authorization),一旦用户通过身份验证,Shiro 框架会进行授权,确定用户是否有权限执行特定的操作。
授权过程中,Shiro框架会检查用户所属的角色和权限,并根据这些信息来决定用户是否有权执行所请求的操作。
3. 加密(Cryptography),Shiro框架还提供了加密功能,可以帮助开发人员对敏感数据进行加密处理,确保数据的安全性。
4. 会话管理(Session Management),Shiro框架还包括会话
管理功能,可以帮助开发人员管理用户的会话状态,确保用户在系
统中的操作是安全和可控的。
总的来说,Shiro框架的工作流程包括身份验证、授权、加密
和会话管理等功能,为应用程序提供了全面的安全保障。
通过集成Shiro框架,开发人员可以快速地为他们的应用程序添加安全功能,保护用户数据和系统资源的安全。
shiro securityutils解析Shiro(Apache Shiro)是一个用于身份验证、授权和加密的开源Java安全框架。
`SecurityUtils`是Shiro框架中的一个工具类,提供了一些便捷的方法来访问和操作Shiro 的安全功能。
以下是对`SecurityUtils`的一些主要功能和用法的解析:1.获取Subject对象:```javaSubject currentUser=SecurityUtils.getSubject();```可以使用`getSubject()`方法获取当前应用程序的Subject对象,Subject代表了当前用户。
通过Subject对象,可以进行身份验证、授权和其他安全操作。
2.身份验证:```javaif(!currentUser.isAuthenticated()){UsernamePasswordToken token=new UsernamePasswordToken("username", "password");token.setRememberMe(true);try{currentUser.login(token);}catch(AuthenticationException e){//身份验证失败}}```使用`login`方法进行身份验证。
在这个例子中,使用了`UsernamePasswordToken`来封装用户名和密码,然后通过`login`方法进行验证。
3.授权检查:```javaif(currentUser.hasRole("admin")){//执行某些操作,具有"admin"角色}```使用`hasRole`方法检查用户是否具有指定的角色。
4.权限检查:```javaif(currentUser.isPermitted("user:read")){//执行某些操作,具有"user:read"权限}```使用`isPermitted`方法检查用户是否具有指定的权限。
shiro框架原理Shiro框架原理。
Shiro是一个功能强大且易于使用的Java安全框架,它提供了身份验证、授权、加密和会话管理等安全功能,可以轻松地集成到任何Java应用程序中。
Shiro框架的原理主要围绕着Subject、SecurityManager、Realm和Session等核心概念展开,下面我们将逐一介绍这些内容。
首先,Subject是Shiro框架中的核心概念之一,它代表了当前用户的安全操作。
Subject可以是一个用户、设备或者其他与应用程序交互的实体,它封装了用户的安全操作,包括身份验证和授权等。
在Shiro框架中,Subject是通过SecurityManager进行管理和操作的。
其次,SecurityManager是Shiro框架的安全管理器,它充当了Subject与应用程序之间的桥梁,负责管理所有的安全操作。
SecurityManager是Shiro框架的核心组件,它协调着所有的安全操作,包括身份验证、授权、加密和会话管理等。
在Shiro框架中,SecurityManager是通过Realm进行身份验证和授权的。
然后,Realm是Shiro框架中用于身份验证和授权的组件,它充当了安全数据源的角色,负责从数据源中获取用户的安全信息。
在Shiro框架中,Realm可以是从数据库、LDAP、文件系统或者其他数据源中获取用户的安全信息,然后进行身份验证和授权操作。
Realm是Shiro框架的核心组件之一,它与SecurityManager协同工作,确保用户的安全操作得到正确的处理。
最后,Session是Shiro框架中用于管理用户会话的组件,它负责管理用户的会话状态,包括创建、销毁、过期和存储用户的会话数据等。
在Shiro框架中,Session可以是基于Web的会话,也可以是基于非Web的会话,它提供了灵活的会话管理功能,可以轻松地集成到任何Java应用程序中。
总结一下,Shiro框架的原理主要围绕着Subject、SecurityManager、Realm和Session等核心概念展开,它提供了强大且灵活的安全功能,可以轻松地集成到任何Java应用程序中。
shiro框架泄露解决方法1.引言1.1 概述概述部分的内容可以包括以下信息:Shiro框架是一个功能强大且广泛使用的Java安全框架,它提供了身份验证、授权、加密、会话管理等安全功能,被广泛应用于Web应用程序和企业级应用系统中。
然而,随着Shiro框架的使用越来越广泛,一些安全问题也随之而来。
其中之一就是Shiro框架泄露的问题。
当Shiro框架的配置不当或在代码中存在安全漏洞时,攻击者可能会通过各种方式获取到Shiro框架的敏感信息,如秘钥、加密算法等,从而对系统进行恶意攻击。
本文的主要目的是介绍Shiro框架泄露问题的解决方法。
文章将从两个方面展开讨论,分别是解决方法1和解决方法2。
在解决方法1中,我们将介绍如何正确配置Shiro框架以避免泄露敏感信息。
这包括对Shiro的加密算法、密码散列函数、会话管理等进行合理的设置和使用。
同时,我们还会分享一些在代码编写阶段应注意的安全最佳实践,以减少潜在的漏洞。
在解决方法2中,我们将介绍一些额外的安全措施,如使用安全的会话管理策略、限制系统对外部资源的访问权限等。
这些措施可以进一步增强系统的安全性,防止黑客利用Shiro框架泄露进行攻击。
通过本文的阅读,读者将能够了解到Shiro框架泄露问题的具体表现、潜在的风险以及相应的解决方法。
我们希望本文能够对读者在使用Shiro框架时保障系统安全起到一定的指导作用,并为未来解决类似安全问题提供一些启示。
1.2 文章结构本文将从引言、正文和结论三个部分来展开讨论shiro框架泄露的解决方法。
在引言部分,我们将对问题进行概述,说明shiro框架泄露所带来的风险和影响。
同时,我们还会介绍文章的结构和目的,以便读者能够更好地理解文章的内容和组织。
在正文部分,我们将详细探讨shiro框架泄露的问题,包括其原因、可能导致的后果以及对系统安全的影响。
接着,我们将提出两种解决方法来应对shiro框架泄露的情况,分别进行详细的介绍和讨论。
shiro框架教程Shiro是一个强大的Java安全框架,可以帮助开发者快速实现身份验证、授权、加密和会话管理等安全功能。
本教程将介绍Shiro框架的基本概念和用法,帮助读者快速上手使用Shiro的各种功能。
一、概述1.1 什么是ShiroApache Shiro是一个Java安全框架,提供了身份验证、授权、加密和会话管理等常用的安全功能,使开发者能够轻松地为自己的应用程序添加安全性。
1.2 Shiro的特点Shiro的特点包括灵活性、简单性、可扩展性和强大的功能。
它提供了易于使用的API和丰富的功能,适用于各种各样的应用程序,从简单的命令行工具到大型企业应用程序。
二、安装和配置2.1 下载和导入Shiro首先,需要从Shiro的官方网站下载Shiro的jar包,并将其导入到项目的classpath中。
目前最新版本为1.7.1,可以从Apache Shiro的官方网站下载。
2.2 Shiro配置文件Shiro的配置文件一般是一个名为shiro.ini的文件,可以通过在classpath根目录下创建该文件来进行配置。
配置文件用于设置Shiro的各种组件和参数。
三、认证3.1 认证流程Shiro的认证流程包括以下几个步骤:- 构建SecurityManager对象:SecurityManager是Shiro的核心组件,它负责处理所有的认证和授权请求。
- 构建Subject对象:Subject代表当前用户,可以通过Subject 对象进行身份验证和授权操作。
- 构建AuthenticationToken对象:AuthenticationToken是用户提交的身份验证信息,可以是用户名/密码、token等。
- 调用Subject的login方法进行身份验证:Subject对象的login方法将AuthenticationToken传递给SecurityManager进行认证。
3.2 基于用户名/密码的认证Shiro提供了简单的基于用户名/密码的认证机制,可以通过用户名和密码来验证用户的身份。
shiro框架思路-回复Shiro框架思路Shiro框架是一个用于身份验证、授权、加密和会话管理的开源Java 安全框架。
它提供了一套简单易用的API,帮助开发人员实现对应用程序的安全性管理。
本文将一步一步回答有关Shiro框架的相关问题,并深入探讨其思路和实现。
1. 什么是Shiro框架?Shiro框架是一个可扩展的安全框架,用于保护任何Java应用程序。
它提供了一套清晰简单的API,可以处理身份验证,授权,加密和会话管理等安全相关的任务。
Shiro框架是在Java中处理安全性问题的一种解决方案。
2. Shiro框架的设计思路是什么?Shiro框架的设计遵循了一些重要的原则:- 简单易用:Shiro提供了一个简单且直观的API,使开发人员能够轻松地实现各种安全性功能。
- 可扩展性:Shiro的设计非常灵活,可以以模块化的方式扩展和集成其他的安全解决方案。
- 统一安全管理:Shiro提供了一个统一的安全管理框架,使得应用程序可以集中处理所有的安全性问题,包括身份验证、授权、加密和会话管理等。
- 面向运营:Shiro允许运营团队在应用程序中集中管理和控制安全性功能,而无需对代码进行太多修改。
3. Shiro框架的核心组件有哪些?Shiro框架的核心组件包括:- Subject:Subject代表当前执行操作的用户,可以是一个人、一台设备或者一个外部系统。
Subject可以进行身份验证、授权和会话管理等操作。
- SecurityManager:SecurityManager是Shiro的核心组件,管理所有的Subject以及它们的安全操作。
它是Shiro框架的入口点,负责协调各个安全组件之间的交互。
- Realm:Realm是Shiro框架的数据源,负责获取安全相关的数据。
Realm通常从数据库、LDAP、文件或其他数据源中获取用户信息、角色/权限信息等。
- Authenticator:Authenticator是Shiro框架的身份验证组件,负责验证Subject的身份。
shiro框架原理Apache Shiro是一个强大而灵活的安全框架,可以为任何应用程序提供安全性支持。
Shiro提供了认证(authentication)、授权(authorization)、加密(encryption)和会话管理(session management)等功能,以及用于实现这些功能的一整套API,可以让你轻松地为你的Java应用程序添加安全机制。
Shiro架构由如下几部分组成:身份验证和授权:Shiro可以轻松实现身份认证(authentication)和授权(authorization)。
身份认证是在Shiro中比较重要的一部分,因为这是你从用户处获得的第一个信息,用于确认用户的身份,并提供给他或她一定的操作权限。
安全(Subject):Shiro提供了一个非常强大的主题(Subject)类,这个类把每一次请求的用户对象封装到一起。
Subject是一组特定的对象(包括用户的标识、加密的密码散列和上次登录时间),拥有了一个正确的身份即代表所有的安全操作。
安全管理:Shiro提供了一个SecurityManager 对象用于管理所有当前SecurityUtils 中注册的主题(Subject)和安全设置,它被定义在shiro.ini 文件中。
任何应用程序都应该设置自己的SecurityManager,这将成为你的主要安全入口点,它会让你控制如何处理和管理被认证的用户和被授权的用户。
会话管理:Shiro提供了一个SessionManager 来帮助你管理用户会话,SessionManager类会处理会话超时登出,以及会话跟踪,SessionManager 类支持HTTP session、普通JavaSE 程序和企业级应用程序。
加密:Shiro提供了一个Cryptography对象来帮助你进行加密,加密是保护应用程序和其他资源的非常有效的方式,Cryptography对象有助于你从加密和解密文件,验证数字签名等操作中受益。
shiro是啥Shiro的核心组件介绍Shiro是一个强大且易用的Java安全框架,它提供了身份验证、授权、加密和会话管理等关键安全功能。
下面对Shiro的核心组件进行详细介绍:1. Subject:Subject是Shiro的核心概念,表示当前正在执行操作的用户。
Subject是一个抽象概念,可以是一个人、一个服务或者一个设备。
Subject可以执行身份验证、授权和会话等操作。
2. SecurityManager:SecurityManager是Shiro的核心组件,负责所有的安全操作。
它是Subject执行操作的入口点,并且管理所有的安全操作。
SecurityManager可以将身份验证、授权和会话管理等功能委托给相应的组件实现。
3. Authenticator:Authenticator负责验证Subject的身份信息。
Shiro支持多种身份验证方式,包括用户名/密码验证、证书验证和第三方认证等。
Authenticator使用配置好的Realm(下面会介绍)获取Subject的身份信息进行验证。
4. Authorizer:Authorizer负责授权操作。
在身份验证成功之后,Authorizer通过用户的角色和权限信息确定用户是否有权限执行特定的操作。
Authorizer使用配置好的Realm获取用户的角色和权限信息。
5. Realm:Realm是Shiro与应用程序进行交互的桥梁,负责获取应用程序保存的用户、角色和权限信息。
Shiro支持多种Realm实现,包括数据库、LDAP、Active Directory等。
开发者可以根据自己的需求选择不同的Realm实现。
6. SessionManager:SessionManager负责管理用户的会话信息。
Shiro可以将用户的会话信息存储在多种存储介质上,如内存、数据库或者缓存中。
SessionManager提供了会话的创建、销毁和管理等功能。
shiro框架的认证和授权流程Shiro是一个轻量级Java安全框架,提供了认证、授权、加密和会话管理等功能,使用起来非常方便。
本文将详细介绍Shiro框架的认证和授权流程,以便读者更好地理解和应用Shiro框架。
一、Shiro框架的认证流程Shiro框架的认证流程可以分为以下几个步骤:1、收集用户身份和凭证:即获取用户输入的用户名和密码。
2、将用户身份和凭证封装成一个AuthenticationToken对象。
3、将AuthenticationToken对象提交给SecurityManager进行认证。
4、SecurityManager将认证请求委托给Authenticator进行具体的认证。
5、Authenticator根据AuthenticationToken,调用Realm从数据源中获取用户身份和凭证进行比对。
6、如果身份和凭证匹配成功,则认证成功,否则认证失败。
7、认证成功后,将用户的身份信息交给Shiro管理,用于后续的访问控制。
二、Shiro框架的授权流程Shiro框架的授权流程可以分为以下几个步骤:1、用户进行访问请求时,Shiro首先判断用户是否已经通过认证,如果没有通过认证则需要进行认证。
2、如果用户已经通过认证,则Shiro会通过Subject对象获取用户的角色和权限信息。
3、Shiro会根据用户的角色和权限信息,从数据库或者内存中获取对应的授权信息。
4、Shiro将授权信息与用户的访问请求进行比对,以决定用户是否有权限访问。
5、如果用户拥有访问权限,则Shiro允许用户进行访问,否则禁止用户进行访问。
总之,Shiro框架的认证和授权流程非常清晰和简单,而且支持多种数据源,如数据库、LDAP、Properties、INI等,可以满足不同的应用需求。
同时,Shiro框架还提供了其他一些有用的功能,如加密解密、会话管理、Remember Me等,具备较强的安全保障能力,是Java 应用开发中不可或缺的安全框架。
SpringBoot系列安全框架ApacheShiro基本功能Apache Shiro是一个强大而灵活的Java安全框架,可以帮助我们简化应用程序的身份验证,授权,密码管理和会话管理等安全功能。
在Spring Boot系列中,集成Apache Shiro可以为我们的应用程序提供一种简单而高效的安全解决方案。
Apache Shiro的基本功能主要包括身份验证和授权。
身份验证包括验证用户的凭据,例如用户名和密码,以确保他们有权访问应用程序。
授权则是确定用户是否有权执行特定的操作或访问特定的资源。
为了集成Apache Shiro,我们需要在项目的pom.xml文件中添加相关依赖,例如:```<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.7.1</version></dependency>```一旦依赖添加完成,我们就可以使用Apache Shiro的注解来保护我们的应用程序。
首先,我们需要配置一个Realm来使Apache Shiro知道从哪里获取用户和角色信息。
我们可以创建一个自定义Realm类并实现Shiro提供的接口来完成此操作。
例如,我们可以创建一个名为CustomRealm的类来获取用户信息:```public class CustomRealm extends AuthorizingRealmprotected AuthorizationInfodoGetAuthorizationInfo(PrincipalCollection principals) //授权操作}protected AuthenticationInfodoGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException//验证操作}```在doGetAuthorizationInfo方法中,我们可以从数据库或其他数据源获取用户的角色和权限信息,并将其添加到AuthorizationInfo对象中返回。
ApacheShiro安全框架—整体功能介绍
Apche shiro是Java的常⽤安全框架之⼀,也是⽬前Java使⽤最多的安全框架。
主要的核⼼功能包括:认证、授权、会话管理、加密。
也提供了额外的功能⽀持在不同环境所关注的问题。
例如:⽀持web的API、缓存、记住⽤户⾝份等。
Apache shiro的功能结构图如下:
⾼层次概览
从Apche shiro 的⾼层次来看整个shiro 的内部结构可以概括如下:
⽤户通过shiro中Subject类实现介⼊shiro。
⽽实例化Subject时,必须先实例化Subject对象中的SecurityManager对象;⽽所有对Subject对象的操作,实际内部是调⽤SecurityManager对象的同名⽅法,SecurityManager内部则是委托Realm接⼝实现类来完成相应的操作。
因此shiro所有的对⽤户的认证和鉴权实际是realm来完成。
shiro的核⼼架构图如下:
可以发现SecurityManager是整个shiro的核⼼。
所有的认证和授权都是交给基层的realm完成;会话管理则和SessionDao配合完成shiro的会话控制。
---------------------。
Java安全框架——Shiro的使⽤详解(附springboot整合Shiro的demo)⽬录Shiro简介Shiro快速⼊门SpringBoot-Shiro整合(最后会附上完整代码)附上最后的完整代码Shiro整合mybatis认证搞完了,我们再来看看授权Shiro-thymeleaf整合Shiro简介1. Apache Shiro是⼀个强⼤且易⽤的Java安全框架,执⾏⾝份验证、授权、密码和会话管理2. 三个核⼼组件:Subject, SecurityManager 和 Realms3. Subject代表了当前⽤户的安全操作4. SecurityManager管理所有⽤户的安全操作,是Shiro框架的核⼼,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
5. Realm充当了Shiro与应⽤安全数据间的“桥梁”或者“连接器”。
也就是说,当对⽤户执⾏认证(登录)和授权(访问控制)验证时,Shiro会从应⽤配置的Realm中查找⽤户及其权限信息。
6. Realm实质上是⼀个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。
当配置Shiro时,你必须⾄少指定⼀个Realm,⽤于认证和(或)授权。
配置多个Realm是可以的,但是⾄少需要⼀个。
Shiro快速⼊门导⼊依赖<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.7.1</version></dependency><!-- configure logging --><!-- https:///artifact/org.slf4j/jcl-over-slf4j --><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>2.0.0-alpha1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>2.0.0-alpha1</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>配置log4j.propertieslog4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - %m %n# General Apache libraries.apache=WARN# Spring.springframework=WARN# Default Shiro logging.apache.shiro=INFO# Disable verbose logging.apache.shiro.util.ThreadContext=WARN.apache.shiro.cache.ehcache.EhCache=WARN配置Shiro.ini(在IDEA中需要导⼊ini插件)[users]# user 'root' with password 'secret' and the 'admin' roleroot = secret, admin# user 'guest' with the password 'guest' and the 'guest' roleguest = guest, guest# user 'presidentskroob' with password '12345' ("That's the same combination on# my luggage" ;)), and role 'president'presidentskroob = 12345, president# user 'darkhelmet' with password 'ludicrousspeed' and roles 'darklord' and 'schwartz'darkhelmet = ludicrousspeed, darklord, schwartz# user 'lonestarr' with password 'vespa' and roles 'goodguy' and 'schwartz'lonestarr = vespa, goodguy, schwartz# -----------------------------------------------------------------------------# Roles with assigned permissions## Each line conforms to the format defined in the# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc# -----------------------------------------------------------------------------[roles]# 'admin' role has all permissions, indicated by the wildcard '*'admin = *# The 'schwartz' role can do anything (*) with any lightsaber:schwartz = lightsaber:*# The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) withgoodguy = winnebago:drive:eagle5快速⼊门实现类 quickStart.javaimport org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apache.shiro.config.IniSecurityManagerFactory;import org.apache.shiro.mgt.DefaultSecurityManager;import org.apache.shiro.realm.text.IniRealm;import org.apache.shiro.session.Session;import org.apache.shiro.subject.Subject;import org.apache.shiro.util.Factory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class quickStart {private static final transient Logger log = LoggerFactory.getLogger(quickStart.class);/*Shiro三⼤对象:Subject:⽤户SecurityManager:管理所有⽤户Realm:连接数据*/public static void main(String[] args) {// 创建带有配置的Shiro SecurityManager的最简单⽅法// realms, users, roles and permissions 是使⽤简单的INI配置。
s h i r o-安全框架Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。
本文就带领读者一睹 Shiro 的风采。
可能大家早先会见过 J-security,这个是 Shiro 的前身。
在 2009 年 3 月初之前,这个安全框架叫做 J-security,由于某些原因,更名为 Shiro(或者Ki,意为 Fortress),是 Apache 的孵化项目,鉴于本文编写时 Shiro 的还没有正式发布的版本,本文使用的是 Jsecurity 的稳定版本 0.9,本文中Shiro 等同于 Jsecurity。
本文将涉及 Shiro 的整体框架、安全模型、关键概念类,同时给出了 Shiro 以及 Grails Shiro Plugin 的使用示例,可以下载文中使用的源代码。
本文代码的开发环境:•Jsecurity 0.9•Grails 1.2.0•Grails Shiro Plugin 1.0.1•SpringSource Tool Suite 2.3Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。
如下是它所具有的特点:1.易于理解的 Java Security API;2.简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);3.对角色的简单的签权(访问控制),支持细粒度的签权;4.支持一级缓存,以提升应用程序的性能;5.内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;6.异构客户端会话访问;7.非常简单的加密 API;8.不跟任何的框架或者容器捆绑,可以独立运行。
目前还有其他出现较早的安全框架,比如 JAAS,Spring Security。
JAAS —面世的时间最早,但是鉴于其在使用上有很大的限制,很少有人真正的使用它。
可以说它不是一个好的应用程序级别的安全框架;Spring Security —目前是 Java 安全框架领域当之无愧的老大,已经非常成熟了;如果使用 Spring 框架,可以首选 Spring Security,但是对于单应用来说,Shiro 更显简单方便。
下面就开始我们的 Shiro 之旅吧!首先,我们来看看的 Shiro 的整体架构,见下图:图 1. 整体架构从上图可以看出,Shiro 主要有四个组件:1.SecurityManager典型的 Facade,Shiro 通过它对外提供安全管理的各种服务。
2.Authenticator对“Who are you ?”进行核实。
通常涉及用户名和密码。
这个组件负责收集 principals 和 credentials,并将它们提交给应用系统。
如果提交的 credentials 跟应用系统中提供的 credentials 吻合,就能够继续访问,否则需要重新提交 principals 和credentials,或者直接终止访问。
3.Authorizer身份份验证通过后,由这个组件对登录人员进行访问控制的筛查,比如“who can do what”,或者“who can do which actions”。
Shiro采用“基于Realm”的方法,即用户(又称 Subject)、用户组、角色和 permission 的聚合体。
4.Session Manager这个组件保证了异构客户端的访问,配置简单。
它是基于 POJO/J2SE的,不跟任何的客户端或者协议绑定。
Shiro 的认证和签权可以通过 JDBC、LDAP 或者 Active Directory 来访问数据库、目录服务器或者 Active Directory 中的人员以及认证 / 签权信息。
SessionManager 通过会话 DAO 可以将会话保存在 cache 中,或者固化到数据库或文件系统中。
从 Shiro 的框架图,已经能够体会到这个工具的简单了。
下面让我们来看看Shiro 是如何工作的。
先了解一下它的安全模型吧!见下图:图 2. 安全模型上图中,涉及了 Shiro 的五个概念:•Subject 是安全领域术语,除了代表人,它还可以是应用。
在单应用中,可将其视为 User 的同义词。
•Principal 是 Subject 的标识,一般情况下是唯一标识,比如用户名。
•Role 和 Permission 分别代表了不同粒度的权限,从上图中可以看出Role 的粒度更大些,Permission 代表了系统的原子权限,比如数据的修改、删除权限。
对于简单的权限应用,可以不需要 Permission。
•Realm 是一个执行者,负责真正的认证和鉴权。
实现应用的安全模块的关键在于:定义合适的 role 和 permission,这就需要遵循如下原则:1.role 没有实质内容,只是代表一组 permission,目的是为了管理的方便,一般都是动态定义;2.permission 一般都是预先定义好的,不允许动态改变,除非源代码改动,它才会变化,它是整个安全模块的基础;3.要使 permission 也能动态定义,并非不可能,但是这将使鉴权非常复杂,甚至可能导致鉴权语句遍布整个程序,得不偿失;4.当然有一个例外:如果知道 permission 动态定义的规则和鉴权规则,如 Grails 的 fileter 中“${controllerName}:${actionName}:${params.id}”也可实现permission 的动态定义理解 Shiro 的架构和安全模型了,我们来看看更具体些的内容。
下图显示了Shiro 中的关键概念类(参考资料 -- JSecurity Mini Guide)。
图 3. 关键类AuthenticationToken 和 AuthenticationInfo前者在认证前使用,描述认证所需的信息,最常用的就是 username 和password 对;后者在认证后使用,内容同前,但是表示已经经过认证的信息。
RememberMe代表的是一种可能状态,并不表示该 Subject 已经经过了认证。
对于一些普通的操作,这种可能状态并无大碍,但一旦涉及安全敏感的操作,必须经过认证。
Credentials 和 CredentialsMatcherCredentials 是 Subject 的证书,在认证时使用,最常用的就是 password。
在通常情况下,为了安全起见,Subject 的 credentials 都需要加密保存,于是 CredentialsMatcher 的作用就体现出来了,见下图:图 4. CredentialsMatcher 的作用这里 CredentialsMatcher 需要将加密后的证书跟用户登录时提供的证书进行比对,完成认证的过程。
PAM= Pluggable Authentication Modules在有多个 Realm 的时候使用。
由认证策略决定认证结果,即 PAM= Relams + 认证策略。
一般的策略有 3 种:AllSuccessful、AtLeastOneSuccessful 和FirstSuccessful。
AuthorizationInfo可以看成是 Role + Permission 的组合体。
PermissionResolver 和 Permission它们之间的关系如下:图 5. PermissionResolver 和 Permission 的关系在 Shiro 中,权限被转化为一种字符串描述(字符串分级表示,称之为WildcardPermission),从而将权限转化为类似于对象 equals 的操作(Shiro 中的 implies 方法)。
内置的权限有 2 个:•AllPermission,总是返回 true•WildcardPermission,权限字符串的表示方式。
这里重点声明一下。
WildcardPermission 是 Shiro 的精妙之处,我们可以将权限表示成字符串,这样对权限的控制可以不拘泥于物理存储,比如对messagge 类具有修改和删除权限可以标识为:message:update,delete:*,其中‘ * ’表示所有;第一级分隔符为‘ : ’;第二级分隔符为‘ , ’,而对于权限字符串的解释完全可以由应用自己来定。
如果要比较权限字符串,可以使用 permission1.implies(permission2),它分别比较对应位置的字符串,在如下情况中,结果会返回 true:•permission1 中的子串有 * 或 permission1 子串 ==permission2 子串;•permission1 无子串,permission2 有;•permission1 有子串,permission2 无,permission1 的所有子串都是*。
总的说来,Shiro 中的 Permission 需要注意如下内容:1.权限的比较实际是字符串的比较,只不过是考虑到了字符串的分级2.字符串的分级划分完全由使用者自己决定,Shiro 的惯例是 3 级:资源 : 操作 : 实例。
3.字符串的使用必须一致,分隔符之间不要有空格,避免无意间引入的不一致。
如:定义使用“file : create, update : 1”,而验证使用“file : update”,那么分解之后一个是“ update ”,一个是“ update”,因空格而引起不等。
Realm这是一个实际访问安全实体的组件,一般是应用相关的,跟数据源的关系是 1-1。
它负责完成认证和鉴权,getAuthenticationInfo 代表了 login 的尝试,鉴权方法则由 Authorizer 继承而来。
此处也体现了 Shiro 代码的另一个特点,通过继承来扩充功能。
以常用的 JdbcRealm 为例,其继承链如下:图 6. JdbcRealm 的继承链Session它关联一个 Subject 的上下文,其作用类似于在 HttpSession 中保存用户标识,session 一旦过期,则重新登录。
Shiro 的 Session 是独立的,其目的是做到环境无关性。
为了利用 Web 环境中,Shiro 实现了一个直接使用HttpSession 的 WebSession。
SecurityManager这是一个Façade 接口,=Authenticator + Authorizer + SessionFactory。
在整体框架图中已经看到了它在 Shiro 中所处的位置。