简介:
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>
相关推荐
随后,针对实际项目朵儿网,结合其业务分析了其 Web 应用的安全性需求: 登录认证需求,浏览器请求拦截需求,用户权限管理需求。 针对朵儿网的这些安全性需求,先是利用 Shiro 的过滤器实现了浏览器请求的 ...
Apache Shiro 是目前使用率较高的一个 Java 安全框架。本视频基于 Shiro 的新版本 1.3.2 录制。内容涵盖 Shiro 认证、加密、授权、安全标签、安全注解、会话管理、缓存、Rememberme 等 JavaEE 企业...2.shiro 加密应用
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓 存等。这不就是我们想要的嘛,而且 Shiro ...
Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越...Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、
分别由浅入深的讲解分析shiro权限框架的使用及配置,从三大核心组件到与springMVC框架的整合使用都整理在dome当中,让你更容易看懂 更容易学会
实战项目与经验分享:通过实际项目实战,让您在实践中掌握SSM的运用,同时分享经验与心得,让您少走弯路。 三、适用人群与场景 无论您是初学者还是资深开发者,无论您是在校学生还是职场人士,本系列资料都将是您...
Apache Shiro 两种姿势绕过认证分析(CVE-2020-17523) 0x01 漏洞描述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何...
毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...
爬虫及数据动态分析管理 环境配置 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/...
本系统用于所有的Web后台应用程序。界面简洁美观 界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运行即可用。内置功能 1. 用户管理:用户是系统操作者。 2. 部门管理:配置系统组织...
Acunetix安全扫描工具,支持各种开发架构和Web服务 。许多企业级,任务关键的应用程序基本都是使用Java框架或Ruby on... 其“深度扫描”爬行引擎可以非常迅速的分析同时使用Java框架和Ruby on Rails开发的Web应用程序。
毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...
安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro 要简单的多。本教程只介绍基本的 Shiro 使用,不会过多分析源码等...
实战项目与经验分享:通过实际项目实战,让您在实践中掌握SSM的运用,同时分享经验与心得,让您少走弯路。 三、适用人群与场景 无论您是初学者还是资深开发者,无论您是在校学生还是职场人士,本系列资料都将是您...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
这种系统通常由软件应用程序支持,为学生和考生提供了在网上参加考试的机会。在线考试系统可以用于各种教育和培训场景,包括学校教育、职业资格认证、招聘考试等。 【主要特点和优势】: 灵活性和便利性:学生和考生...
为解决城市停车收费问题,做到车位资源的充分利用与信息共享,选用Java编程语言Spring Boot框架设计开发,Shiro权限控制,MD5算法信息加密,采用MySQL关系型数据库进行管理,大数据统计分析面板运用EChars可视化图表...
毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...
毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...
毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用...