También estoy de acuerdo en que Spring Security se siente demasiado complicado (para mí). Claro, han hecho cosas para reducir la complejidad, como crear espacios de nombres XML personalizados para reducir la cantidad de configuración XML, pero para mí, estos no abordan mi problema fundamental personal con Spring Security: sus nombres y conceptos a menudo son confusos en general para yo. Es difícil simplemente "entenderlo".
Sin embargo, en el momento en que comienzas a usar Shiro, simplemente lo 'entiendes'. Lo que era difícil de entender en el mundo de la seguridad es mucho más fácil de entender. Las cosas que son insoportablemente difíciles de usar en el JDK (por ejemplo, Ciphers) se simplifican a un nivel que no solo es soportable, sino que a menudo es un placer usarlo.
Por ejemplo, ¿cómo hash + salt una contraseña y codificar en base64 en Java o Spring Security? Tampoco son tan simples e intuitivos como la solución de Shiro:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
No hay necesidad de códecs comunes ni nada más. Solo el frasco de Shiro.
Ahora con respecto a los entornos de Spring, la mayoría de los desarrolladores de Shiro usan Spring como su entorno de aplicación principal. Eso significa que la integración de Shiro's Spring es excelente y todo funciona excepcionalmente bien. Puede estar seguro de que si está escribiendo una aplicación Spring, tendrá una experiencia de seguridad completa.
Por ejemplo, considere el ejemplo de configuración Spring XML en otra publicación de este hilo. Así es como harías (esencialmente) lo mismo en Shiro:
<?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>
Aunque un poco más detallado que el otro ejemplo de Spring, es más fácil leer IMO.
¡También encontrará que usar las definiciones de cadena de filtro de Shiro es probablemente la forma más fácil de definir cadenas de filtro generales y reglas de seguridad basadas en la web! Mucho mejor que definirlos en web.xml.
Finalmente, Shiro también ofrece una 'capacidad de conexión' extrema. Verá que puede configurar y / o reemplazar casi cualquier cosa debido a la arquitectura POJO / inyección amigable de Shiro. Shiro predetermina casi todo a valores predeterminados razonables y puede anular o configurar solo lo que necesita.
Al final del día, creo que elegir cualquiera de estos dos es más sobre su modelo mental: ¿cuál de los dos tiene más sentido y es más intuitivo para usted? Para algunos será Shiro, para otros será Spring Security. Shiro funciona muy bien en entornos de primavera, por lo que diría que elegir en función de cuál de los dos disfrutas más y tiene más sentido para ti.
Para más información sobre la integración de Shiro's Spring: http://shiro.apache.org/spring.html