
JeeSite4.0功能权限 / 基础 (Apache Shiro)
作者:@JeeGit 长春叭哥
升级日期:2018-10-27

Apache Shiro实战教程
Apache Shiro?是一个功能强大且易于使用的Java安全框架,可执行身份验证,受权,加密和会话管理。借助Shiro易于了解的API,您可以快速轻松地保护任何应用程序 - 从最小的移动应用程序到最大的Web和企业应用程序。
Shiro可以在任何环境中运行,从最简单的命令行应用程序到最大的企业Web和集群应用程序,但是我们将在这个QuickStart的简单`main`方法中使用最简单的示例,这样您即可以感受到API。
将Apache Shiro集成到基于Spring的应用程序中。
将Apache Shiro集成到基于Guice的应用程序中。
CAS SSO服务器使用Jasig CAS SSO服务器保护您的WebApp。

Apache Shiro究竟有哪些功能
Apache Shiro旨在成为最全面,但也是最容易使用的Java安全框架。以下是少量更精细的框架概述:
最容易了解Java Security API的地方。类和接口名称直观且有意义。任何东西都是可插拔的,但一切都有很好的默认值。
支持跨一个或者多个可插拔数据源(LDAP,JDBC,ActiveDirectory等)的身份验证('登录')。
基于角色或者细粒度权限执行受权("访问控制"),也使用可插拔数据源。
一流的缓存支持,加强了应用程序性能。
内置基于POJO的企业会话管理。在Web和非Web环境中或者在需要单点登录(SSO)或者群集或者分布式会话的任何环境中使用。
异构用户端会话访问。您不再被迫仅使用httpSession或者有状态会话Bean,这通常会不必要地将应用程序绑定到特定环境。无论部署环境如何,Flash applet,C#应用程序,Java Web Start和Web应用程序等现在都可以共享会话状态。
简单的单点登录(SSO)支持搭载上述企业会话管理。假如会话跨多个应用程序联合,则也可以共享客户的身份验证状态。登录到任何应用程序,其余人都识别登录。
使用最简单的可用密码学 API 保护数据,为您提供超出Java默认提供的密码和哈希值的功能和简单性。
一个非常强大但低配置的 Web框架,可以保护任何URL或者资源,自动解决登录和注销,执行Remember Me服务等。
极低数量的必须依赖项。独立配置只要要slf4j-api.jar和slf4j的绑定.jars之一。Web配置还需要commons-beanutils-core.jar。可以在需要时增加基于功能的依赖项(Ehcache缓存,基于Quartz的会话验证,Spring依赖项注入等)。
Apache Shiro身份验证功能
身份验证是身份验证的过程 - 您试图验证客户能否是他们所说的人。为此,客户需要提供系统了解和信任的某种身份证实。
Shiro框架旨在使身份验证尽可能干净和直观,同时提供丰富的功能。以下是Shiro身份验证功能的一个亮点。
2.1.1基于主题
Subject Based - 您在Shiro中执行的几乎所有操作都基于当前正在执行的客户,称为主题。您可以轻松地在代码中的任何位置检索主题。这使您更容易了解并在您的应用程序中使用Shiro。
2.1.2单一方法调用
Single Method call - 身份验证过程是单个方法调用。只要要一个方法调用即可以简化API并简化应用程序代码,从而节省您的时间和精力。
2.1.3丰富的异常层次结构
Rich Exception Hierarchy - Shiro提供了丰富的异常层次结构,以提供有关登录失败起因的详细说明。层次结构可以帮助您更轻松地诊断与身份验证相关的代码错误或者用户服务问题。此外,丰富性可以帮助您在需要时创立更复杂的身份验证功能。
2.1.4内置'Remember Me'
Remember Me' built in - Shiro API中的标准功能是能够在客户返回应用程序时记住他们。您可以通过最少的开发工作为他们提供更好的客户体验。
2.1.5可插拔数据源
Pluggable data sources - Shiro使用可插拔数据访问对象(DAO)(称为Realms)连接到LDAP和Active Directory等安全数据源。为了帮助您避免自己构建和维护集成,Shiro为LDAP,Active Directory和JDBC等流行数据源提供了开箱即可使用的领域。假如需要,您还可以创立自己的领域,以支持基本领域中未包含的特定功能。
2.1.6使用一个或者多个领域登录
Login with one or more realms - 使用Shiro,您可以轻松地针对一个或者多个领域对客户进行身份验证,并返回其身份的统一视图。此外,您可以使用Shiro的身份验证策略概念自己设置身份验证过程。可以在配置文件中设置策略,因而更改不需要修改源代码 - 从而降低了复杂性和维护工作量。
Apache Shiro受权功能
受权(也称为访问控制)是确定应用程序中资源的访问权限的过程。换句话说,确定"谁有权访问什么。"受权用于答复安全问题,例如"允许客户编辑帐户","此客户能否允许查看此网页","该客户能否可以访问"到这个按钮?"这些都决定了客户可以访问的内容,因而都代表受权检查。
受权是任何应用程序的关键元素,但它很快就会变得非常复杂。Shiro的目标是消除受权的大部分复杂性,以便您可以更轻松地构建安全的软件。以下是Shiro受权功能的一个亮点。
2.2.1基于主题
Subject-based - 您在Shiro中执行的几乎所有操作都基于当前正在执行的客户,称为主题。您可以轻松访问主题,检索主题并在代码中的任何位置检查其角色,权限或者其余相关属性。这使您更容易了解并在您的应用程序中使用Shiro。
2.2.2基于角色或者权限的检查
Checks based on roles or permissions - 因为受权的复杂性在应用程序之间存在很大差异,因而Shiro旨在实现灵活性,根据您的项目需求支持基于角色的安全性和基于权限的安全性。
2.2.3强大而直观的权限语法
Powerful and intuitive permission syntax - 作为一种选择,Shiro提供了一种开箱即可使用的权限语法,称为通配符权限,可帮助您对应用程序可能具备的细粒度访问策略进行建模。通过使用Shiro的通配符权限,您将取得易于解决和人类可读的语法。此外,您不必花费时间和精力创立自己的方法来表示访问策略。
2.2.4多个强制执行选项
Multiple enforcement options - Shiro中的受权检查可以通过代码内检查,JDK 1.5注释,AOP和JSP / GSP Taglib来完成。Shiro的目标是让您根据自己的喜好和项目需求选择使用您认为最佳的选项。
2.2.5强大的缓存支持
Strong caching support- 任何现代开源和/或者企业缓存产品都可以插入Shiro,以提供快速有效的客户体验。对于受权,缓存对于较大环境中的性能或者使用后台安全数据源的更复杂策略至关重要。
2.2.6可插拔数据源
Pluggable data sources - Shiro使用可插拔数据访问对象(称为Realms)连接到保存访问控制信息的安全数据源,如LDAP服务器或者关系数据库。为了帮助您避免自己构建和维护集成,Shiro为LDAP,Active Directory和JDBC等流行数据源提供了开箱即可使用的领域。假如需要,您还可以创立自己的领域,以支持基本领域中未包含的特定功能。
2.2.7支持任何数据模型
Supports any data model - Shiro可以支持访问控制的任何数据模型 - 它不会强制模型在您身上。您的领域实现最终决定您的权限和角色如何组合在一起以及能否向Shiro返回"是"或者"否"答案。此功能允许您以您选择的方式构建应用程序,Shiro将为您提供支持。
会话是您的客户在使用您的应用程序时携带一段时间的数据桶。传统上,会话专用于Web或者EJB环境。不再!Shiro支持任何应用程序环境的会话。此外,Shiro还提供了许多其余强大的功能来帮助您管理睬话。
POJO/J2SE based (IoC friendly) - Shiro中的所有内容(包括会话和会话管理的所有方面)都是基于接口的,并使用POJO实现。这允许您使用任何与JavaBeans兼容的配置格式(如JSON,YAML,Spring XML或者相似机制)轻松配置所有会话组件。您还可以根据需要轻松扩展Shiro的组件或者编写自己的组件,以完全自己设置会话管理功能。
Session Storage - 因为Shiro的Session对象是基于POJO的,因而会话数据可以轻松存储在任意数量的数据源中。这允许您精确自己设置应用程序的会话数据所在的位置 - 例如,文件系统,企业缓存,关系数据库或者专有数据存储。
Easy and Powerful Clustering - 使用任何易于使用的网络缓存产品(如Ehcache,Coherence,GigaSpaces等),可以轻松地对Shiro的会话进行群集。人。这意味着您可以为Shiro配置一次且仅一次的会话群集,无论您部署到哪个Web容器,您的会话都将以相同的方式进行群集。无需特定于容器的配置!
Heterogeneous Client Access - 与EJB或者Web会话不同,Shiro会话可以通过各种用户端技术"共享"。例如,桌面应用程序可以"看到"并"共享"同一客户在服务器端Web应用程序中使用的相同物理睬话。我们不知道Shiro以外的任何框架都可以支持这一点。
Event listeners - 事件侦听器允许您在会话的生命周期内侦听生命周期事件。您可以侦听这些事件并对它们做出反应以获取自己设置应用程序行为 - 例如,在会话过期时升级客户记录。
Host address retention – Shiro会话保留启动会话的主机的IP地址。这允许您确定客户所在的位置并做出相应的反应(主要用于IP关联是确定性的Intranet环境)。
Inactivity/expiration support – 会话因为预期的不活动而到期,但是touch()假如需要,可以通过一种方法延长它们以保持它们"活着"。这在客户可能正在使用桌面应用程序的Rich Internet Application(RIA)环境中很有用,但可能无法定期与服务器通信,但服务器会话不应过期。
Transparent web use - Shiro的Web支持实现了HttpSession界面及其所有相关的API。这意味着您可以在现有Web应用程序中使用Shiro会话,而无需更改任何现有Web代码。
Can be used for SSO - 由于Shiro会话是基于POJO的,所以它们很容易存储在任何数据源中,并且假如需要,它们可以跨应用程序"共享"。这可用于提供简单的登录体验,由于共享会话可以保留身份验证状态。
Apache Shiro密码学特性
密码术是通过隐藏信息或者将其转换为无意义来保护信息免受不良访问的做法,因而没有其余人可以阅读它。Shiro专注于密码学的两个核心要素:使用公钥或者私钥加密数据的密码,以及对密码等数据进行不可逆加密的哈希(也就是消息摘要)。
Shiro Cryptography的主要目标是采用传统上非常复杂的领域,并在提供强大的密码学功能的同时使其余人轻松实现。
2.4.1.1接口驱动,基于POJO
Interface-driven, POJO based -所有Shiro的API都是基于接口的,并作为POJO实现。这使您可以使用JavaBeans兼容格式(如JSON,YAML,Spring XML等)轻松配置Shiro Cryptography组件。您还可以根据需要覆盖或者自己设置Shiro,利用其API来节省您的时间和精力。
2.4.1.2JCE上的简化包装
Simplified wrapper over JCE-除非您是加密专家,否则Java加密扩展(JCE)可能很复杂且难以使用。Shiro的Cryptography API更易于了解和使用,并且它们极大地简化了JCE概念。所以现在即便是Cryptography新手也可以在几分钟而不是几小时或者几天内找到他们需要的东西。并且您不会牺牲任何功能,由于假如您需要它们依然可以访问更复杂的JCE选项。
2.4.1.3 "Object Orientifies"加密概念
"Object Orientifies" cryptography concepts -JDK / JCE的密码和消息摘要(Hash)类是笼统类,非常令人困惑,要求您使用带有类型不安全字符串参数的obtuse工厂方法来获取要使用的实例。Shiro'Object Orientifies'的密码和哈希,基于干净的对象层次结构,允许您通过简单的实例化来使用它们。
Runtime Exceptions -与Shiro中的其余任何地方一样,所有加密异常都是RuntimeExceptions。您可以根据需要决定能否捕获异常。
OO Hierarchy - -不同的是JCE,四郎密码申诉追踪与他们的数学概念,一个面向对象的类层次结构:AbstractSymmetricCipherService,DefaultBlockCipherService,AesCipherService等,这使您可以轻松覆盖现有的类,并根据需要扩展功能。
Just instantiate a class - 与使用String令牌参数的JCE令人困惑的工厂方法不同,使用2.4.2.3Shiro Ciphers要容易得多
More secure default settings - 只要实例化一个类,根据需要使用JavaBeans属性对其进行配置,并根据需要使用它。例如,new AesCipherService()。
更安全的默认设置 - JCE Cipher实例采用"最小公分母"默认值,不会自动启用更安全的选项。Shiro将自动启用更安全的选项,以确保您的数据在默认情况下是安全的,帮助您防止意外的安全漏洞。
Default interface implementations - Shiro提供了开箱即可使用的默认Hash(JDK中的消息摘要)实现,例如MD5,SHA1,SHA-256等。这提供了一种类型安全的构造方法(例如new Md5Hash(data)),而不是强制在JDK中使用类型不安全的字符串工厂方法。
Built-in Hex and Base64 conversion -四郎哈希实例可以经由他们的自动提供散列数据的十六进制和Base64编码toHex()和toBase64()方法。所以现在你不需要弄清楚如何正确编码数据。
Built-in Salt and repeated hashing support - 在散列数据时,Salts和重复散列迭代是非常有价值的工具,特别是在保护客户密码时。Shiro的Hash实现支持盐和多个哈希迭代开箱即可使用,因而您无需在任何需要的地方重复此逻辑。
https://spring.io/projects/spring-security
Spring Security以前叫做acegi,后成为Spring的一个子项目,也是目前最为流行的一个安全权限管理框架。
Spring Security关注的重点是为企业应用安全层提供服务,在企业级软件开发过程中业务问题领域存在着各式各样的需求。银行系统跟电子商务应用就有很大的不同。电子商务系统与企业销售自动化工具又有很大不同。这些用户化需求让应用安全显得有趣,富有挑战性而且物有所值。Spring Security为基于J2EE的企业应用软件提供了一套全面的安全处理方案。
[国外]https://blog.novatec-gmbh.de/java-ee-security-framework-comparison/
[国内]

CSDN文章

(1) Spring 社区当下更为活跃,Srping生态圈的处理方案或者者第三方处理方案更全面。
(2) Spring Security除了不能脱离Spring,shiro的功能它都有。而且Spring Security对Oauth、OpenID也有支持,Shiro则需要自己手动实现。Spring Security官方的宣传是权限细粒度更高(大部分国内网友+国外网友+小编还未发现高在哪里)。
(3)Apache Shiro 更容易上手,更容易了解。
(4) SpringSecurity 安全性更胜一筹,但是学习与使用成本更高。
(5)个人认为现阶段需求,权限的操作粒度能控制在路径及按钮上,数据粒度通过sql实现。Shrio简单够用。
(6) OAuth,OpenID 站点间统一登录功能,现租户与各个产品间单点登录已经通过cookies实现,所以Spring Security的这两个功能可以不考虑。
很多网友有这样的评价:
SpringSide网站的权限也是用Shrio做的。SpringSide是以Spring Framework为核心的,Pragmatic风格的JavaEE应用参考示例,是JavaEE世界中的主流技术选型,最佳实践的总结与演示。
这个有点误导大家,实际上,SpringSide 与JeeSite、Jfinal相似,都属于国产开源框架,并非是由Spring官方出品。