简介:
1、在设计系统安全验证时是否有些失意?
2、现有的java安全验证是否有点复杂?
Apache Shiro提供了简单而又强大的系统验证方法。
下面逐一介绍Apache Shiro的:
- 架构原理
- 如何使用它
What is Apache Shiro?
Shiro提供了验证(authentication)、授权(authorization), 加密(cryptography), session管理(session management),并且可以用于任何系统的安全管理。
谁在用Shiro?
Shiro及其前身应用在了各种大小和各种行业的企业中,成为了Apache下的一个顶级项目。
Commercial companies like Katasoft, Sonatype, MuleSoft, one of the major social networks, and more than a few New York commercial banks use Shiro to secure their commercial software and websites.
架构
核心概念:主题(Subject), 安全管理(SecurityManager), and 领域(Realms)
Subject
可以理解为“用户”,这里没有起名为“用户”是因为“用户”一般指人。而Subject不仅仅指人,还可以是第三方的应用。
或者可以简单理解为"与软件交互的事物"。
你可以在系统的任务地方获取Shiro Subject:
import org.apache.shiro.subject.Subject; import org.apache.shiro.SecurityUtils; ... Subject currentUser = SecurityUtils.getSubject();
一旦获取到了Subject,几乎可以满足了90%的用户应用:登录、注销、权限验证、session获取等。
SecurityManager
如果说Subject是对单个用户的安全管理,那么SecurityManager是对所有用的安全管理。
SecurityManager是Shiro框架的核心,它像一系列的“保护伞”,自动调用内部的安全组件。
当然一旦SecurityManager的相关配置设置好后,我们需要应对的只是Subject的API。
那我们如何来配置SecurityManger呢?这取决于您的业务系统。
如果是web应用,您可以在web.xml中配置Shiro Servlet Filter,它会帮您设置SecurityManger实例。如果是单机系统,需要使用不同配置方式。当然这里也提供多种不同方式的配置形式。
Shiro推荐的默认配置方式是“ini',简单、易读、依赖少。
cm = org.apache.shiro.authc.credential.HashedCredentialsMatcher
cm.hashAlgorithm = SHA-512
cm.hashIterations = 1024
# Base64 encoding (less text):
cm.storedCredentialsHexEncoded = false
iniRealm.credentialsMatcher = $cm
[users]
jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2
asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB
上面配置中分了两个段落[main]、[users]
[main]中配置SecurityManager或其引用的对象。上面配置的了两个对象cm、iniRealm.
[users]用于简单系统或测试系统的用户配置。
上面配置演示,不在于讲解Shiro的配置文件段落,而是说明"ini"的配置方式。
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.util.Factory;
...
//1. Load the INI configuration
Factory<SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");
//2. Create the SecurityManager
SecurityManager securityManager = factory.getInstance();
//3. Make it accessible
SecurityUtils.setSecurityManager(securityManager);
Realms
Realm扮演着Shiro与系统中安全数据的桥梁的角色。系统真正执行安全认证交互的时候,shiro会检索系统中配置的realms,从而获取系统中的安全数据。
这样来看realm实质是security-specific DAO。
在配置Shiro的realms时,至少要有一个认证或授权的realm。
realm配置时可以连接不同类型的datasource,譬如LADP、jdbc、properties、ini等等。当然也可以自定义realm以实现个性化的需求。
ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm
ldapRealm.userDnTemplate = uid={0},ou=users,dc=mycompany,dc=com
ldapRealm.contextFactory.url = ldap://ldapHost:389
ldapRealm.contextFactory.authenticationMechanism = DIGEST-MD5
上面介绍了怎么配置shiro环境,下面看看作为一个开发人员,怎样使用这种架构。
认证(Authentication)
Shiro提供Subject-centric API,也就是几乎所有与shiro的交互是通过Subject来实现的,认证也不例外。
最常见的认证场景是通过用户提供的用户名和密码,验证用户是否能成功登录。在Shiro中直接调用Subject的login方法即可:
AuthenticationToken token =
new UsernamePasswordToken(username, password);
//2. Get the current Subject:
Subject currentUser = SecurityUtils.getSubject();
//3. Login:
currentUser.login(token);
Subject执行认证动作时,SecurityManager会收到AuthenticationToken,并转发给一个或多个realm,每个realm都可以认证动作。
但是,一旦验证失败,又该怎么获取失败结果呢?
可以使用AuthenticationException。
try {
currentUser.login(token);
} catch (IncorrectCredentialsException ice) { …
} catch (LockedAccountException lae) { …
}
…
catch (AuthenticationException ae) {…
}
系统认证成功后,用户就可以访问系统了。但这种认证不意味着可以在系统中做任何事。
怎么限制一个用户可以在系统中做什么?
通过authorization(授权)来实现。
授权(Authorization)
授权是访问控制,以免有些用户在系统里胡作非为。
用户能做什么,一般由系统配置的用户角色来限定,Subject当然也定义了获取用户角色的简单方式:
//show the ‘Create User’ button
} else {
//grey-out the button?
}
这中硬编码的方式缺点很明显,一旦角色名有了变化,就要重改代码。
Shiro提出来许可(permissions)的概念。一个permission就是一个功能的声明,例如:‘open a door’, ‘create a blog entry’, ‘delete the ‘jsmith’ user’, etc.
//show the ‘Create User’ button
} else {
//grey-out the button?
}
上面这种方式,一旦角色或用户被赋予了“user:create”这种需要,就可以显示“Create User”按钮了。
Session管理(Session Management)
Shiro提供的Session管理有两个明显的优点:
- 容器无关
- 跨客户端技术
Session session = subject.getSession(boolean create);
非web应用也可以创建和使用session。
session.getAttribute(“key”, someValue);
Date start = session.getStartTimestamp();
Date timestamp = session.getLastAccessTime();
session.setTimeout(millis);
...
加密(Cryptography)
Shiro提供的加密目标是简单使用jdk提供的加密方法。
需要注意的事Shiro提供的加密与Subject是无关的,不用使用Subject的情况下也可以使用它的加密。
Shiro最关注的两点是:hash和cipher
使用Shiro提供的API要比直接使用jdk的api简单许多,一个简单的MD5加密:
MessageDigest md = MessageDigest.getInstance("MD5");
md.digest(bytes);
byte[] hashed = md.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
Web Support
通过配置filter基础shiro到web工程。
URL-Specific Filter Chains
复杂验证可以配置url的过滤链。
[urls] /assets/** = anon /user/signup = anon /user/** = user /rpc/rest/** = perms[rpc:invoke], authc /** = authc
JSP Tag Library
Shiro提供多种jsp标签。
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> ... <p>Hello <shiro:user> <!-- shiro:principal prints out the Subject’s main principal - in this case, a username: --> <shiro:principal/>! </shiro:user> <shiro:guest> <!-- not logged in - considered a guest. Show the register link: --> ! <a href=”register.jsp”>Register today!</a> </shiro:guest> </p>
相关推荐
Apache Shiro 是一款轻量级的安全框架,广泛用于 Java 应用程序的身份验证、授权和会话管理。本文将深入探讨 Shiro 内存模型,尤其是整合 Spring 后的架构和工作原理。 在 Shiro 与 Spring 整合启动完成后,内存中...
3. ** Realm实现**:Realm是Shiro与应用中用户和权限数据源交互的接口,你可以看到如何自定义Realm连接到数据库或其他数据源,完成身份认证和授权。 “课件”可能包含了以下内容: 1. **理论讲解**:介绍Shiro的...
Shiro源码分析将帮助我们理解其工作原理和核心组件。 首先,Shiro的设计理念可以概括为:简单易用且功能强大。Shiro具有三个核心概念:Subject、SecurityManager和Realms。 1. Subject代表了当前与软件交互的用户...
然后,`shrio-example.rar`提供了一些实战代码示例,帮助开发者更好地理解和运用Shiro。这些示例可能包括简单的登录注销、角色和权限的设置、会话管理等场景。通过运行和分析这些示例,你可以看到Shiro如何在实际...
总的来说,“Shiro入门到精通”课程覆盖了从基础概念到高级特性的全面内容,结合源码分析和Spring Security的对比,将使你对Shiro有深入的理解,能够在实际项目中灵活运用。无论你是初学者还是有经验的开发者,都能...
- **Realms**:是Shiro与应用程序特定安全数据源(如数据库、LDAP等)的桥梁,负责验证凭证并获取权限信息。 - **Cryptography**:Shiro提供了加密工具,用于密码哈希、消息摘要等安全操作。 - **Session ...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地...在"shiro-realm案例"中,通过分析`shiro.web`项目,我们可以深入了解如何将这个概念应用到实际的Web应用中。
总之,这个“Shiro Maven 完整案例代码”提供了学习和实践 Shiro 框架的一个好机会,通过对代码的分析和运行,开发者可以更好地理解和掌握 Shiro 在实际项目中的运用。同时,结合 SQL 查询文档,可以了解到 Shiro ...
通过学习这套资源,你将能够掌握Shiro的核心概念,了解其工作流程,并能运用到实际项目中,构建出安全可靠的Java应用程序。无论是简单的Web应用还是复杂的分布式系统,Shiro都能提供强有力的安全保障。
本指南将详细探讨Shiro与Spring Web项目集成的过程,并分析Shiro在其中的作用和集成的关键点。 ### 1. Shiro与Spring框架的整合 Shiro与Spring Web项目的整合,首先需要在Spring项目中整合Shiro。整合的过程可以...
Apache Shiro是一个强大的、易于使用的Java安全框架,它提供了认证、授权、会话管理以及加密功能。...通过源码分析,我们可以深入理解Shiro的工作原理和架构设计,从而在实际开发中更加有效地运用Shiro进行安全控制。
通过对 Shiro1.2.2 的源码分析,我们可以了解到它如何处理各种安全问题,以及如何构建高效、灵活的安全架构。同时,源码的学习有助于我们理解和解决在实际开发中遇到的安全问题,提升我们的编程技能。
内部通过Realm来获取和验证用户的凭证, Realm是Shiro与应用安全数据源的桥梁,它可以是数据库、LDAP或任何其他存储用户信息的地方。 2. **Authorization(授权)**:授权涉及确定用户是否有权限执行某个操作或访问...
6. **Session管理**:Shiro默认使用内存中的session管理,但可以通过配置使它与Spring Session或应用服务器的session管理集成,以便于集群环境下的session共享。 7. **测试与调试**:设置好所有配置后,进行测试以...
接着,实现身份验证和授权逻辑,这通常涉及到自定义`Realm`, Realm是Shiro与应用中用户数据源交互的接口。 **3. Shiro的安全校验** Shiro提供了一套灵活的API来进行安全校验。例如,你可以使用`Subject`对象进行...
Shiro的目标是帮助开发者更轻松地处理非常复杂的安全需求,并且通过其高度灵活的设计,它几乎可以与任何应用架构进行无缝集成。 #### 二、Shiro的主要功能模块 Shiro的核心功能主要分为以下几个部分: 1. **认证...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密以及会话管理功能,简化了应用安全的实现。在提到的 "shiro_attack_by J1anfen" 工具中,重点是针对 Apache Shiro 的一个特定安全问题:...
在这个"shiro代码示例 web项目"中,我们可以深入理解Shiro如何与Web应用程序相结合,实现用户身份验证、权限控制以及会话管理等核心功能。 首先,Shiro的认证过程是项目的核心部分。在Web应用中,当用户尝试登录时...