`
piabo2161978
  • 浏览: 24018 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

shiro分析与应用

 
阅读更多

简介:

 

1、在设计系统安全验证时是否有些失意?

2、现有的java安全验证是否有点复杂?

 Apache Shiro提供了简单而又强大的系统验证方法。

 

下面逐一介绍Apache Shiro的:

  • 架构原理
  • 如何使用它

 

What is Apache Shiro?

Shiro提供了验证(authentication)、授权(authorization), 加密(cryptography), session管理(session management),并且可以用于任何系统的安全管理。

 

谁在用Shiro?

Shiro及其前身应用在了各种大小和各种行业的企业中,成为了Apache下的一个顶级项目。

Many open-source communities are using Shiro as well, for example, Spring, Grails, Wicket, Tapestry, Tynamo, Mule, and Vaadin, just to name a few.

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',简单、易读、依赖少。

Configuring Shiro with INI
[main]
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"的配置方式。

Loading shiro.ini Configuration File
import org.apache.shiro.SecurityUtils;
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以实现个性化的需求。

Example realm configuration snippet to connect to LDAP user data store 写道
[main]
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方法即可:

 

//1. Acquire submitted principals and credentials:
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。

Handle Failed Login 写道
/3. Login:
try {
currentUser.login(token);
} catch (IncorrectCredentialsException ice) { …
} catch (LockedAccountException lae) { …
}

catch (AuthenticationException ae) {…
}

 

系统认证成功后,用户就可以访问系统了。但这种认证不意味着可以在系统中做任何事。

怎么限制一个用户可以在系统中做什么?

通过authorization(授权)来实现。

 

 

授权(Authorization)

授权是访问控制,以免有些用户在系统里胡作非为。

用户能做什么,一般由系统配置的用户角色来限定,Subject当然也定义了获取用户角色的简单方式:

Role Check
if ( subject.hasRole(“administrator”) ) {
//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. 

Permission Check 写道
if ( subject.isPermitted(“user:create”) ) {
//show the ‘Create User’ button
} else {
//grey-out the button?
}

 上面这种方式,一旦角色或用户被赋予了“user:create”这种需要,就可以显示“Create User”按钮了。

 

 

Session管理(Session Management)

Shiro提供的Session管理有两个明显的优点:

  • 容器无关
  • 跨客户端技术
Subject’s Session
Session session = subject.getSession();
Session session = subject.getSession(boolean create);

 

非web应用也可以创建和使用session。

Session methods 写道
Session session = subject.getSession();
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加密:

JDK’s MessageDigest 
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.digest(bytes);
byte[] hashed = md.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

 

Shiro
String hex = new Md5Hash(myFile).toHex();

 

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> 

 

 

 

 

分享到:
评论

相关推荐

    shiro 内存模型分析

    Apache Shiro 是一款轻量级的安全框架,广泛用于 Java 应用程序的身份验证、授权和会话管理。本文将深入探讨 Shiro 内存模型,尤其是整合 Spring 后的架构和工作原理。 在 Shiro 与 Spring 整合启动完成后,内存中...

    shiro学习源码与资料

    3. ** Realm实现**:Realm是Shiro与应用中用户和权限数据源交互的接口,你可以看到如何自定义Realm连接到数据库或其他数据源,完成身份认证和授权。 “课件”可能包含了以下内容: 1. **理论讲解**:介绍Shiro的...

    shiro源码分析

    Shiro源码分析将帮助我们理解其工作原理和核心组件。 首先,Shiro的设计理念可以概括为:简单易用且功能强大。Shiro具有三个核心概念:Subject、SecurityManager和Realms。 1. Subject代表了当前与软件交互的用户...

    shiro教程 跟我学Shiro教程

    然后,`shrio-example.rar`提供了一些实战代码示例,帮助开发者更好地理解和运用Shiro。这些示例可能包括简单的登录注销、角色和权限的设置、会话管理等场景。通过运行和分析这些示例,你可以看到Shiro如何在实际...

    Shiro入门到精通

    总的来说,“Shiro入门到精通”课程覆盖了从基础概念到高级特性的全面内容,结合源码分析和Spring Security的对比,将使你对Shiro有深入的理解,能够在实际项目中灵活运用。无论你是初学者还是有经验的开发者,都能...

    Shiro集成OAuth2

    - **Realms**:是Shiro与应用程序特定安全数据源(如数据库、LDAP等)的桥梁,负责验证凭证并获取权限信息。 - **Cryptography**:Shiro提供了加密工具,用于密码哈希、消息摘要等安全操作。 - **Session ...

    shiro-realm案例

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地...在"shiro-realm案例"中,通过分析`shiro.web`项目,我们可以深入了解如何将这个概念应用到实际的Web应用中。

    Shiro maven 完整案例代码

    总之,这个“Shiro Maven 完整案例代码”提供了学习和实践 Shiro 框架的一个好机会,通过对代码的分析和运行,开发者可以更好地理解和掌握 Shiro 在实际项目中的运用。同时,结合 SQL 查询文档,可以了解到 Shiro ...

    Shiro安全验证框架

    通过学习这套资源,你将能够掌握Shiro的核心概念,了解其工作流程,并能运用到实际项目中,构建出安全可靠的Java应用程序。无论是简单的Web应用还是复杂的分布式系统,Shiro都能提供强有力的安全保障。

    shiro与spring web 项目集成.pdf

    本指南将详细探讨Shiro与Spring Web项目集成的过程,并分析Shiro在其中的作用和集成的关键点。 ### 1. Shiro与Spring框架的整合 Shiro与Spring Web项目的整合,首先需要在Spring项目中整合Shiro。整合的过程可以...

    shiro源码分析二

    Apache Shiro是一个强大的、易于使用的Java安全框架,它提供了认证、授权、会话管理以及加密功能。...通过源码分析,我们可以深入理解Shiro的工作原理和架构设计,从而在实际开发中更加有效地运用Shiro进行安全控制。

    Shiro1.2.2_源码(压缩包)

    通过对 Shiro1.2.2 的源码分析,我们可以了解到它如何处理各种安全问题,以及如何构建高效、灵活的安全架构。同时,源码的学习有助于我们理解和解决在实际开发中遇到的安全问题,提升我们的编程技能。

    shiro-root-1.7.0_ROOT_shirocore1.7_shiro1.7源码_

    内部通过Realm来获取和验证用户的凭证, Realm是Shiro与应用安全数据源的桥梁,它可以是数据库、LDAP或任何其他存储用户信息的地方。 2. **Authorization(授权)**:授权涉及确定用户是否有权限执行某个操作或访问...

    Spring整合Shiro做权限控制模块详细案例分析

    6. **Session管理**:Shiro默认使用内存中的session管理,但可以通过配置使它与Spring Session或应用服务器的session管理集成,以便于集群环境下的session共享。 7. **测试与调试**:设置好所有配置后,进行测试以...

    shiro资料shiro资料

    接着,实现身份验证和授权逻辑,这通常涉及到自定义`Realm`, Realm是Shiro与应用中用户数据源交互的接口。 **3. Shiro的安全校验** Shiro提供了一套灵活的API来进行安全校验。例如,你可以使用`Subject`对象进行...

    最全的安全框架shiro学习视频

    Shiro的目标是帮助开发者更轻松地处理非常复杂的安全需求,并且通过其高度灵活的设计,它几乎可以与任何应用架构进行无缝集成。 #### 二、Shiro的主要功能模块 Shiro的核心功能主要分为以下几个部分: 1. **认证...

    shiro 反序列化漏洞综合利用工具 shiro_attack_by J1anfen

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密以及会话管理功能,简化了应用安全的实现。在提到的 "shiro_attack_by J1anfen" 工具中,重点是针对 Apache Shiro 的一个特定安全问题:...

    shiro代码示例 web项目

    在这个"shiro代码示例 web项目"中,我们可以深入理解Shiro如何与Web应用程序相结合,实现用户身份验证、权限控制以及会话管理等核心功能。 首先,Shiro的认证过程是项目的核心部分。在Web应用中,当用户尝试登录时...

Global site tag (gtag.js) - Google Analytics