`
piabo2161978
  • 浏览: 23537 次
  • 性别: 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> 

 

 

 

 

分享到:
评论

相关推荐

    Java安全框架Shiro在Web中的研究与应用_翁云翔.caj

    随后,针对实际项目朵儿网,结合其业务分析了其 Web 应用的安全性需求: 登录认证需求,浏览器请求拦截需求,用户权限管理需求。 针对朵儿网的这些安全性需求,先是利用 Shiro 的过滤器实现了浏览器请求的 ...

    Shiro 视频教程+源码+课件

    Apache Shiro 是目前使用率较高的一个 Java 安全框架。本视频基于 Shiro 的新版本 1.3.2 录制。内容涵盖 Shiro 认证、加密、授权、安全标签、安全注解、会话管理、缓存、Rememberme 等 JavaEE 企业...2.shiro 加密应用

    Shiro开发文档

    Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓 存等。这不就是我们想要的嘛,而且 Shiro ...

    springboot和shiro的结合百知网

    Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越...Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、

    shiro安全权限框架 实战应用技术

    分别由浅入深的讲解分析shiro权限框架的使用及配置,从三大核心组件到与springMVC框架的整合使用都整理在dome当中,让你更容易看懂 更容易学会

    shiro与web项目整合 技术架构基于SSM.zip

    实战项目与经验分享:通过实际项目实战,让您在实践中掌握SSM的运用,同时分享经验与心得,让您少走弯路。 三、适用人群与场景 无论您是初学者还是资深开发者,无论您是在校学生还是职场人士,本系列资料都将是您...

    shiro-cve-2020-17523:shiro-cve-2020-17523 漏洞的两种绕过姿势分析 以及配套的漏洞环境

    Apache Shiro 两种姿势绕过认证分析(CVE-2020-17523) 0x01 漏洞描述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何...

    spring spring mvc shiro maven学生宿舍管理系统.zip

    毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...

    【毕业设计】爬虫及数据动态分析管理.zip

    爬虫及数据动态分析管理 环境配置 jdk1.8 Maven 3.3.9 Mysql 5.6 SpringBoot 1.4.3 Shiro 1.2.5 Gson 2.3.1 Mybatis 3.2.7 Webmagic 0.6.1 Echarts类库 freemarker web端框架 Springboot/Mybatis/Shiro/maven/...

    基于Spring Boot+Apache Shiro+Thymeleaf+MyBatis开发的网站后台权限管理系统

    本系统用于所有的Web后台应用程序。界面简洁美观 界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运行即可用。内置功能 1. 用户管理:用户是系统操作者。 2. 部门管理:配置系统组织...

    Acunetix_Web_Vulnerability安全扫描程序

    Acunetix安全扫描工具,支持各种开发架构和Web服务 。许多企业级,任务关键的应用程序基本都是使用Java框架或Ruby on... 其“深度扫描”爬行引擎可以非常迅速的分析同时使用Java框架和Ruby on Rails开发的Web应用程序。

    OA协同办公与管理系统(毕业设计)Spring+SpringMVC+Mybatis+Shiro+JqueryEasyUI.zip

    毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...

    xmljava系统源码-shiro:shirow3school+自编教程

    安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro 要简单的多。本教程只介绍基本的 Shiro 使用,不会过多分析源码等...

    这个一个SSM+shiro+maven+bootstrap的项目实战,经典的图书管理系统。.zip

    实战项目与经验分享:通过实际项目实战,让您在实践中掌握SSM的运用,同时分享经验与心得,让您少走弯路。 三、适用人群与场景 无论您是初学者还是资深开发者,无论您是在校学生还是职场人士,本系列资料都将是您...

    前后端分离外卖点单系统,采用Shiro进行权限管理.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    在线考试系统,基于SpringBoot、Shiro、MyBatis、Redis框架Online

    这种系统通常由软件应用程序支持,为学生和考生提供了在网上参加考试的机会。在线考试系统可以用于各种教育和培训场景,包括学校教育、职业资格认证、招聘考试等。 【主要特点和优势】: 灵活性和便利性:学生和考生...

    毕业设计基于SpringBoot+MySQ的停车收费管理系统的设计与实现源码+数据库+论文

    为解决城市停车收费问题,做到车位资源的充分利用与信息共享,选用Java编程语言Spring Boot框架设计开发,Shiro权限控制,MD5算法信息加密,采用MySQL关系型数据库进行管理,大数据统计分析面板运用EChars可视化图表...

    通过spring+spring mvc+mybatis+shiro搭建的博客系统.zip

    毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...

    LayUI+Spring Boot+MySQL+JPA+Shiro——科研信息管理系统.zip

    毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...

    spring boot 1.5 + mybatis + shiro + layui 搭建的后台权限管理系统.zip

    毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...

Global site tag (gtag.js) - Google Analytics