何时从容器管理的安全性转移到 Apache Shiro、Spring Security 等替代方案?

Posted

技术标签:

【中文标题】何时从容器管理的安全性转移到 Apache Shiro、Spring Security 等替代方案?【英文标题】:When to move from Container managed security to alternatives like Apache Shiro, Spring Security? 【发布时间】:2011-12-08 14:58:00 【问题描述】:

我正在尝试保护使用 JSF2.0 构建的应用程序。

我很困惑人们什么时候会选择使用 Shiro、Spring Security 或 owasp 的 esapi 等安全替代方案而留下容器管理的安全性。在 Stack Overflow 上看到 related questions 的一些内容后,我意识到过去 JSF 开发人员更喜欢基于容器的安全性。但我也被强烈推荐使用 Apache Shiro。我在安全问题方面是新手,不知道可能是什么相关问题以及如何处理它们。因此,我正在寻找能够通过其默认设置/自行处理大多数安全问题的东西。

就我的应用程序需求而言,我有一个社交应用程序,其中具有不同角色的用户可以访问不同的页面集,并且可以根据他们的角色在这些页面上使用不同级别的功能。

在这种情况下,你认为我可以选择什么?

我个人一直被说服选择 Shiro,因为它易于使用并且可以为新手处理大部分事情。

【问题讨论】:

谁强烈推荐它,他们给出了什么理由? 原因是:“使用 shiro 很容易配置安全性,shiro 通过其默认设置处理大部分问题,现有的 Java 安全机制(如 JAAS)过于混乱等等等等。比较适合我这种对安全问题不太了解的新手” 好,假设这一切都是真的,你的问题到底是什么? 谢谢!我想知道:1.) 你们都这么认为吗2.)什么情况下,人们考虑从容器管理的安全性迁移到 Spring security/shiro 等其他解决方案 3.) 迁移到的任何缺点像 shiro 这样的 JSF 应用程序的替代品? '它'是什么?士郎?雅思? CMA? 【参考方案1】:

我喜欢 Shiro 的地方在于它非常容易设置基于权限的安全性。 JAAS 高度基于角色,具有讽刺意味的是,这种粒度对消费者 web 应用程序比对企业应用程序更有用(我们可以从您的要求中注意到)。

应用服务器在 JAAS 之上提供一些服务是很常见的,例如单点登录、内置登录模块等,所以有时当权限粒度不是要求时,您应该选择 JAAS。

上次我检查 Shiro 也不支持双向 ssl 身份验证(使用数字证书),但您可能不会使用它...

如果您使用 Shiro,您的应用程序可能在应用程序服务器/servlet 容器之间更具可移植性(哦,讽刺的是!),因为 JavaEE 安全配置往往是针对大多数重要设置的供应商特定的。

总而言之,根据您指定的要求:

使用 AppServer(GlassFish、JBoss):JAAS(ootb authc/authz,内置登录模块) 使用 Servlet 容器(Jetty/Tomcat):Shiro(更易于设置和使用)

希望对你有帮助:)

【讨论】:

【参考方案2】:

除了以下内容,我对 Apache Shiro 一无所知,但您引用的内容实际上是逐字逐句来自他们的Web page,其中包含一些错误陈述,例如“[JAAS] 需要只有程序员才能更改的静态定义”,和“JAAS 与虚拟机级别的关注点过于紧密相关”,以及 JAAS 与用户和角色无关的暗示,这完全是错误的。我希望有很多说服力来摆脱容器管理的安全性。它是 Servlet 规范的一部分,因此任何容器都必须支持它;很好理解;它由没有第三方的 JDK 类支持; ...它对我有用;-)

【讨论】:

但是据我所知,容器管理的安全并没有涵盖可以满足网络应用程序安全需求的所有内容,而且对于新手来说并不容易(在网络安全域中),配置?我想这些是相同的限制/缺点!? @Marcos,你猜对了。我将首先定义您的实际需求,然后查看哪些系统可以支持它们。目前您只是在重申广告。 @EJB 关于您的评论,“很好理解”:根据我的经验,没有什么比事实更糟的了。每次我在全国范围内介绍 Shiro 时,我都会问观众“这里有多少人使用 JAAS?”。平均而言 - 这并不夸张 - 100 人中约有 5 人举手。是的,没错,5%。当被问到一个后续问题时,“有多少人喜欢它?”那5个人总是放下手。没有一只手撑着。 Shiro 比 JAAS 更容易使用方式。在你注销一个你说你一无所知的解决方案之前,我建议你先尝试一下 :) @LesHazlewood 我看不出我在哪里写了任何东西。我所做的是对一个以虚假声明推销自己的系统表达了一些合理的怀疑。 @EJB 您在不完全了解 Apache Shiro 的情况下判断了 OP 是否应该使用 Shiro。并且声明并非错误:Java 安全策略文件是静态的,需要程序员更改它们,ProtectionDomain 和 CodeSource 是非常特定于 VM 的问题。并且没有暗示用户/角色——只是与 Shiro 相比,JAAS 支持它们的方式很难使用。干杯!【参考方案3】:

我已经决定 SpringSecurity (SS) 将成为我们的身份验证和授权框架。主要是因为SS做了OpenID和OAuth。我将不得不为权限/组/用户/实体系统定制它。我计划在“EntityManager/Entity”级别、服务级别和 Web/API 级别进行授权。 “锁上门,但把你的珠宝放在后面房间里一个 3 吨重的保险箱里” 很多后半部分 Shiro 处理得更好。但是尝试将 openid4j/openauth4j 集成到 Shiro 中时,我感觉不太舒服。

在没有任何干扰或代码臃肿的情况下挑选两者的功能真是太好了。这是最好的选择。

PS,Spring 带来了很多其他的东西,比如与 JSF 的集成,所以它有很大的吸引力。

【讨论】:

是的,onLogin、onLogout、onCSRF、onHttpBasic 等事件的统一接口,用于安全提供功能,附加 SecurityProvider 参数的具体实现,如 JAAS、CMA、Shiro、Spring Security 等为您的好主意而存在的某个地方,我还没有找到它。

以上是关于何时从容器管理的安全性转移到 Apache Shiro、Spring Security 等替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

何时从容器管理的安全性转移到 Apache Shiro、Spring Security 等替代方案?

何时从容器管理的安全性转移到 Apache Shiro、Spring Security 等替代方案?

如何将应用程序的日志从一个容器转移到kubernetes中的另一个容器中

由于文件持久性而从应用服务转移到 Docker 容器?

如何避免贫乏的领域模型,或者何时将方法从实体转移到服务中

简单易用的Apache shiro框架,以及复杂完整的springboot security安全框架