Anch'io sono d'accordo sul fatto che Spring Security sia troppo complicata (per me). Certo, hanno fatto cose per ridurre la complessità, come la creazione di spazi dei nomi XML personalizzati per ridurre la quantità di configurazione XML, ma per me questi non risolvono il mio problema personale fondamentale con Spring Security: i suoi nomi e concetti sono spesso confusi in generale per me. È difficile semplicemente "ottenerlo".
Nel momento in cui inizi a utilizzare Shiro, lo capisci e basta. Ciò che era difficile da capire nel mondo della sicurezza è molto più facile da capire. Le cose che sono insopportabilmente difficili da usare nel JDK (ad es. Ciphers) sono semplificate a un livello non solo sopportabile, ma spesso piacevole da usare.
Ad esempio, come si fa a hash + salt una password e base64 a codificarla in Java o Spring Security? Né sono semplici e intuitivi come la soluzione di Shiro:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
Non c'è bisogno di codec comuni o altro. Solo il barattolo Shiro.
Ora, per quanto riguarda gli ambienti Spring, la maggior parte degli sviluppatori Shiro usa Spring come ambiente applicativo principale. Ciò significa che l'integrazione di Shiro Spring è eccezionale e funziona tutto eccezionalmente bene. Puoi stare certo che se stai scrivendo un'app Spring, avrai un'esperienza di sicurezza completa.
Ad esempio, considera l'esempio di configurazione Spring XML in un altro post di questo thread. Ecco come faresti (essenzialmente) la stessa cosa in 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>
Sebbene leggermente più dettagliato dell'altro esempio di primavera, è più facile leggere l'IMO.
Scoprirai anche che l'uso delle definizioni della catena di filtri di Shiro è probabilmente il modo più semplice per definire catene di filtri generali e regole di sicurezza basate sul Web di sempre! Molto più bello che definirli in web.xml.
Infine, Shiro offre anche estrema "innestabilità". Vedrai che puoi configurare e / o sostituire praticamente qualsiasi cosa grazie all'architettura POJO / iniezione-friendly di Shiro. Per impostazione predefinita, Shiro assume quasi tutte le impostazioni predefinite e puoi sostituire o configurare solo ciò di cui hai bisogno.
Alla fine della giornata, penso che scegliere uno di questi due sia qualcosa di più per il tuo modello mentale - quale dei due ha più senso ed è più intuitivo per te? Per alcuni sarà Shiro, per altri sarà Spring Security. Shiro funziona alla grande in ambienti primaverili, quindi direi di scegliere in base a quale dei due ti piace di più e ha più senso per te.
Per ulteriori informazioni sull'integrazione di Shiro in primavera: http://shiro.apache.org/spring.html