java - Shiro vs. SpringSecurity
spring-security (3)
Actualmente estoy evaluando frameworks de seguridad basados en Java, soy un usuario de Spring 3.0, así que parece que SpringSecurity sería la elección correcta, pero la seguridad de Spring parece sufrir de una complejidad excesiva, ciertamente no parece que sea más fácil implementar la seguridad, Shiro parece ser mucho más coherente y fácil de entender. Estoy buscando listas de pros y contras entre estos dos marcos.
Había estado usando Spring Security (versión 3.1) por unos meses y estaba bastante contento con eso. Es realmente potente y tiene una característica muy agradable, ¡especialmente después de implementar todo a mano como lo hice antes! Sin embargo, fue como leer en alguna parte, como algo que configuró una vez cerca del comienzo del desarrollo de la aplicación, y luego rezar para que siga trabajando hasta el final, porque si tiene que solucionarlo lo hará probablemente haya olvidado la mayoría de las cosas que tenía que parametrizar.
Pero luego apareció un nuevo proyecto, con requisitos de seguridad más complejos. En resumen, tuvimos que implementar algún tipo de SSO personalizado entre un par de aplicaciones web relacionadas.
Sabía exactamente lo que quería lograr en términos de lógica HTTP, cookies, identificaciones de sesión y demás, y qué debería suceder en qué orden, pero pasé la mayor parte del día luchando con las API de Spring Security, y todavía no podía entender exactamente qué clase o interfaz debo implementar o anular, y cómo conectarlos en el contexto. Toda la API se sintió realmente compleja y un poco esotérica a veces. Y aunque el documento es bastante bueno para los casos de uso general e incluso para algunas personalizaciones, no fue lo suficientemente profundo como para cubrir mis necesidades.
Después de leer las respuestas aquí y en otros lugares de la web, tuve la impresión de que Shiro sería más fácil de entender y personalizar según mis necesidades. Así que lo probé.
Y estoy contento de haberlo hecho, porque después de un día trabajando en él logré aprender lo suficiente sobre las API no solo para configurar un sistema básico de autenticación y autorización en mi aplicación web de Spring sin problemas, sino también para implementar el comportamiento de SSO personalizado que estaba buscando. Solo tuve que extender 2 o 3 clases, y todo tomó solo unas 25 líneas de configuración XML en mi contexto de primavera.
Como conclusión, sobre la facilidad de uso y los aspectos de la curva de aprendizaje, Shiro es realmente muy agradable, y creo que probablemente lo haga en el futuro, a menos que me falten algunas características o algún otro problema (que no he tenido). hasta aquí).
TL; DR: Ambos son potentes, pero Shiro es mucho más fácil de aprender.
No tengo experiencia en usar Shiro, y estoy "parcialmente" de acuerdo con lo que dijo sobre Spring Security. Antes de Spring Security 3.x, Spring Security (o Acegi) fue muy doloroso de configurar. Una configuración simple basada en roles tomará al menos 140 líneas de configuración XML críptica ... Lo sé porque realmente conté las líneas yo mismo. Fue algo donde lo configuró una vez, y reza para que funcione para siempre sin que vuelva a tocar la configuración, porque puede asegurar que ha olvidado lo que significa toda la configuración. :)
Con Spring Security 3.x, ha mejorado enormemente. Introduce el espacio de nombres de security
que acorta drásticamente la configuración de 140 líneas a ~ 30 líneas. Aquí hay un ejemplo de Spring Security 3.x de uno de mis proyectos:
<?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>
La belleza de Spring Security 3.x es que es extremadamente configurable, lo que contribuye a uno de los principales inconvenientes: demasiado complicado de entender. La documentación no es fácil de leer porque estoy parcialmente familiarizado con algunos de los términos que utilizó Spring Security. Sin embargo, las opciones están ahí si necesita crear su configuración personalizada o controlar cuán granular desea que sea su seguridad. O bien, puede seguir con las <30 líneas anteriores para realizar una comprobación de seguridad basada en roles.
Lo que realmente me gusta de Spring Security una vez que está configurado, la seguridad está integrada en el proyecto sin problemas. Es como si el código del proyecto real no supiera la existencia de la seguridad ... y eso es bueno, porque me permite desconectar o actualizar fácilmente el componente de seguridad en el futuro (por ejemplo: cambiar la autenticación de la base de datos a LDAP / CAS auth).
También estoy de acuerdo en que Spring Security se siente demasiado complicado (para mí). Claro, han hecho cosas para reducir la complejidad, como la creación de espacios de nombres XML personalizados para reducir la cantidad de configuración XML, pero para mí, estos no resuelven mi problema fundamental personal con Spring Security: sus nombres y conceptos suelen ser confusos en general para yo. Es difícil simplemente ''obtenerlo''.
En el momento en que empiezas a usar a 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, Cifrado) 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 base64 la codifica en Java o Spring Security? Ninguno de los dos es tan simple e intuitivo como la solución de Shiro:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
No hay necesidad de commons-codec o cualquier otra cosa. Solo el frasco de Shiro.
Ahora, en lo que respecta a los entornos de Spring, la mayoría de los desarrolladores de Shiro usan Spring como su principal entorno de aplicaciones. 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 en 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 es un poco más detallado que el otro ejemplo de Spring, es más fácil leer IMO.
También encontrará que utilizar las definiciones de la cadena de filtros 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 de POJO / inyección de Shiro. Shiro establece de manera predeterminada casi todo en sus valores predeterminados y puede anular o configurar solo lo que necesita.
Al final del día, creo que elegir cualquiera de estos dos es más acerca de tu modelo mental: ¿cuál de los dos tiene más sentido y es más intuitivo para ti? Para algunos será Shiro, para otros será Spring Security. Shiro funciona muy bien en entornos de primavera, por lo que yo 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