Ich stimme auch zu, dass sich Spring Security (für mich) zu kompliziert anfühlt. Sicher, sie haben Dinge getan, um die Komplexität zu reduzieren, wie das Erstellen von benutzerdefinierten XML-Namespaces, um die Menge der XML-Konfiguration zu reduzieren, aber für mich geht dies nicht auf mein persönliches grundlegendes Problem mit Spring Security ein: Die Namen und Konzepte sind im Allgemeinen oft verwirrend mich. Es ist schwer, es einfach zu bekommen.
Sobald Sie Shiro verwenden, bekommen Sie es einfach. Was in der Sicherheitswelt schwer zu verstehen war, ist viel einfacher zu verstehen. Dinge, die im JDK unerträglich schwer zu verwenden sind (z. B. Chiffren), werden auf ein Niveau vereinfacht, das nicht nur erträglich, sondern oft auch eine Freude ist.
Wie können Sie beispielsweise ein Kennwort hashen + salzen und base64 in Java oder Spring Security codieren? Weder sind so einfach und intuitiv wie Shiros Lösung:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
Kein Commons-Codec oder sonst etwas nötig. Nur das Shiro-Glas.
In Bezug auf Spring-Umgebungen verwenden die meisten Shiro-Entwickler Spring als primäre Anwendungsumgebung. Das bedeutet, dass Shiros Spring-Integration hervorragend ist und alles außergewöhnlich gut funktioniert. Sie können sicher sein, dass Sie beim Schreiben einer Spring-App ein umfassendes Sicherheitserlebnis haben.
Betrachten Sie beispielsweise das Spring XML-Konfigurationsbeispiel in einem anderen Beitrag in diesem Thread. So würden Sie (im Wesentlichen) dasselbe in Shiro tun:
<?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>
Obwohl etwas ausführlicher als das andere Spring-Beispiel, ist es einfacher, IMO zu lesen.
Sie werden auch feststellen, dass die Verwendung von Shiros Filterkettendefinitionen wahrscheinlich der einfachste Weg ist, allgemeine Filterketten und webbasierte Sicherheitsregeln zu definieren! Viel schöner als sie in web.xml zu definieren.
Schließlich bietet Shiro auch extreme Steckbarkeit. Sie werden sehen, dass Sie dank Shiros POJO / Injection-freundlicher Architektur fast alles konfigurieren und / oder ersetzen können. Shiro setzt fast alles standardmäßig auf vernünftige Standardeinstellungen und Sie können nur das überschreiben oder konfigurieren, was Sie benötigen.
Letztendlich denke ich, dass die Wahl eines dieser beiden Modelle mehr von Ihrem mentalen Modell abhängt - welches der beiden Modelle ist sinnvoller und für Sie intuitiver? Für einige wird es Shiro sein, für andere wird es Spring Security sein. Shiro funktioniert hervorragend in Frühlingsumgebungen, daher würde ich sagen, wählen Sie basierend darauf, welche der beiden Sie mehr genießen und was für Sie am sinnvollsten ist.
Weitere Informationen zur Spring-Integration von Shiro: http://shiro.apache.org/spring.html