四郎与SpringSecurity

我目前正在评估基于Java的安全框架,我是一个Spring 3.0用户,所以SpringSecurity似乎是正确的select,但是Spring安全性看起来过于复杂,似乎并没有让安全性更容易实现, Shiro似乎更连贯和更容易理解。 我正在寻找这两个框架之间的优缺点清单。

我也同意Spring Security感觉太复杂(对我来说)。 当然,他们已经做了一些事情来降低复杂性,比如创build自定义的XML命名空间来减lessXMLconfiguration的数量,但是对于我来说,这些并没有解决个人对于Spring Security的根本性问题:它的名字和概念常常令人困惑,我。 很难“得到它”。

第二个你开始使用Shiro虽然,你只是'得到它'。 在安全领域中难以理解的东西更容易理解。 在JDK中难以使用的东西(例如Cipher)被简化为不仅难以忍受的水平,而且常常是一种使用的乐趣。

例如,你如何hash + salt密码和base64编码在Java或春季安全? 不像Shiro的解决scheme那样简单直观:

ByteSource salt = new SecureRandomNumberGenerator().nextBytes(); new Sha512Hash(password, salt).toBase64(); 

不需要commons-codec或其他任何东西。 只是西罗瓶。

现在对于Spring环境来说,大多数Shiro开发人员使用Spring作为主要的应用程序环境。 这意味着Shiro的Spring集成非常好,而且这一切都非常好。 您可以放心,如果您正在编写Spring应用程序,您将拥有全面的安全体验。

例如,请考虑此线程中另一篇文章中的Spring XMLconfiguration示例。 以下是你如何(基本上)在四郎做同样的事情:

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login.jsp"/> <property name="successUrl" value="/home.jsp"/> <property name="unauthorizedUrl" value="/unauthorized.jsp"/> <property name="filterChainDefinitions"> <value> /secure/** = authc /** = anon </value> </property> </bean> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"/> </bean> <bean id="myRealm" class="..."> ... </bean> 

虽然稍微比其他Spring示例更详细,但读取IMO更容易。

您还会发现使用Shiro的filter链定义可能是定义常规filter链和基于Web的安全规则的最简单方法! 比在web.xml中定义它们要好得多。

最后,四郎也提供极端的“可插拔性”。 由于Shiro的POJO /注入友好型架构,您将看到您可以configuration和/或replace任何东西。 Shiro几乎将所有东西都默认为默认值,您可以仅覆盖或configuration所需的东西。

在这一天结束的时候,我认为select这两者中的一个更多的是关于你的心智模式 – 哪一个更有意义,更直观? 对于一些它将是四郎,对于另一些它将是spring安全。 Shiro在春季环境中performance出色,所以我会说select哪个更适合你,哪个更适合你。

有关Shiro的Spring集成的更多信息,请访问http://shiro.apache.org/spring.html

我没有使用Shiro的经验,我“部分”同意你对Spring Security的评论。 在Spring Security 3.x之前,Spring Security(或者Acegi)非常痛苦。 一个简单的基于angular色的configuration将需要至less140行神秘的XMLconfiguration…我知道这一点,因为我实际上自己数线。 这是你设置了一次的东西,你祈祷它会永远工作,没有你再次触摸configuration,因为你可以保证你忘记了所有的configuration意味着什么。 🙂

随着Spring Security 3.x,它有了巨大的改进。 它引入了security名称空间,可以将configuration从140行大幅缩短到30行。 下面是我的一个项目的Spring Security 3.x的例子:

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <security:http auto-config="true"> <security:form-login login-page="/index.do" authentication-failure-url="/index.do?login_error=1" default-target-url="/index.do" always-use-default-target="true" /> <security:logout logout-success-url="/index.do" /> <security:intercept-url pattern="/secure/**" access="ROLE_ADMIN,ROLE_USER" /> <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> </security:http> <bean id="customAuthenticationProvider" class="my.project.CustomAuthenticationProviderImpl"> ... </bean> <security:authentication-manager> <security:authentication-provider ref="customAuthenticationProvider" /> </security:authentication-manager> </beans> 

Spring Security 3.x的优点在于它非常易于configuration,这也是导致其中一个主要缺点:太复杂。 这个文档不容易阅读,因为我只是部分熟悉Spring Security使用的一些术语。 但是,如果您需要创build自定义configuration或控制您希望安全的粒度,那么选项就在那里。 否则,可以坚持上面的<30行来执行基于angular色的安全检查。

我真的喜欢Spring Security,一旦build立,安全性就可以无缝集成到项目中。 这就好像实际的项目代码不知道安全性的存在……这很好,因为它允许我在将来轻松地分离或升级安全组件(例如:将数据库authentication更改为LDAP / CAS AUTH)。

我一直在使用Spring Security(3.1版)几个月,对此感到非常满意。 它非常强大,并且有一些非常好的function,特别是在像以前那样手工完成之后! 不过,就像我在某个地方看到的那样,在应用程序开始的时候就开始build立了一些东西,然后祈祷它继续工作到最后,因为如果你必须修复它,你会可能已经忘记了大部分你必须参数的东西。

但随后又出现了一个新的项目,其中有更复杂的安全要求。 总之,我们必须在几个相关的webapps之间实现某种自定义的SSO。

我确切地知道我想在HTTP逻辑,cookies,会话ID和内容方面达到什么样的目的,以什么顺序发生,但是我花了一天的时间与Spring Security API挣扎,仍然无法确切地说我应该实现或覆盖什么类或接口,以及如何在上下文中插入它们。 整个API感觉真的很复杂,有时也有点深奥。 虽然这个文档对于一般用例甚至是一些个性化定制都是相当不错的,但是它并没有深入到足以满足我的需求。

在阅读了这里和网上其他地方的答案之后,我得到了Shiro会更容易理解和定制我的需求的印象。 所以我试了一下。

我很高兴我这样做了,因为经过一天的工作,我设法了解了API,不仅在我的Spring Web应用程序中build立了一个基本的身份validation和授权系统,而且还实现了自定义SSO行为寻找。 我只需要扩展2或3个类,而且在我的spring上下文中只需要大约25行XMLconfiguration。

所以,作为一个结论,在易用性和学习曲线方面,Shiro真的很可爱,我想我可能会在未来继续下去,除非我遇到一些缺乏的function或其他问题(我没有至今)。

TL; DR:两者都很强大,但四郎更容易学习。