我没有使用 Shiro 的经验,而且我“部分”同意您关于 Spring 安全性的说法。在 Spring Security 3.x 之前,设置 Spring Security (或 Acegi)非常痛苦。一个简单的基于角色的配置将需要至少140行隐蔽的 XML 配置... ... 我知道这一点,因为我实际上自己计算了这些行。这是你设置了一次,你祈祷它将永远工作,而不会再次触及配置,因为你可以保证你已经忘记了所有的配置意味着什么。:)
通过 Spring Security 3.x,它得到了极大的改进。它引入了 security命名空间,大幅度地将配置从140行缩短到30行。下面是我的一个项目的 Spring Security 3.x 示例:-
Spring Security 3.x 的美妙之处在于它是极其可配置的,这导致了一个主要缺点: 太复杂以至于无法理解。这些文档也不容易阅读,因为我对 Spring Security 使用的一些术语只是部分地熟悉。但是,如果需要创建自定义配置或控制安全性的粒度,则可以使用这些选项。或者,您可以坚持使用上面的 < 30行来执行基于角色的安全检查。
我真正喜欢 Spring Security 的地方在于,它一旦建立起来,安全性就会无缝地集成到项目中。这就好像实际的项目代码不知道安全性的存在... ... 这是好事,因为它允许我在将来轻松地分离或升级安全性组件(例如: 将数据库认证更改为 LDAP/CAS 认证)。
我也同意 Spring Security (对我来说)感觉太复杂了。当然,他们已经做了一些事情来降低复杂性,比如创建定制的 XML 名称空间来减少 XML 配置的数量,但是对我来说,这些并没有解决 Spring Security 的 天啊个人基本问题: 它的名称和概念对我来说通常是混乱的。很难只是“得到它”。
在一天结束的时候,我认为选择这两者中的任何一个更多的是关于你的思维模式——这两者中的哪一个对你来说更有意义和更直观?对于一些人来说,它将是 Shiro,对于其他人来说,它将是 Spring Security。Shiro 在 Spring 环境中工作得很好,所以我认为应该根据这两个环境中你更喜欢哪一个,哪一个对你来说最有意义。
我已经使用 Spring Security (版本3.1)几个月了,并且对它非常满意。它真的很强大,并有一些非常好的功能,特别是在实现了一切后,因为我以前所做的!不过,就像我在某个地方读到的那样,你在应用程序开发之初设置了一些东西,然后祈祷它能一直工作到最后,因为如果你不得不去修复它,你可能已经忘记了大部分需要参数化的东西。
但是后来出现了一个新项目,带有更复杂的安全需求。简而言之,我们必须在两个相关的 Web 应用程序之间实现某种自定义 SSO。
我确切地知道我想要在 HTTP 逻辑、 cookie、会话 ID 和其他东西方面实现什么,以及应该以什么顺序发生什么,但是我花了一天的大部分时间与 Spring Security API 作斗争,仍然不能确切地弄清楚我应该实现或覆盖什么类或接口,以及如何在上下文中插入它们。整个 API 给人的感觉非常复杂,有时还有点深奥。虽然该文档对于一般用例甚至一些定制都很好,但是它还不足以满足我的需求。