Shiro vs. SpringSecurity

Attualmente sto valutando i framework di sicurezza basati su Java, sono un utente di Spring 3.0 quindi sembrava che SpringSecurity sarebbe stata la scelta giusta, ma la sicurezza di Spring sembra soffrire di eccessiva complessità, non sembra certo che stia rendendo la sicurezza più facile da implementare, Shiro sembra essere molto più coerente e più facile da capire. Sto cercando liste di pro e contro tra questi due framework.

Anch’io sono d’accordo sul fatto che la sicurezza di spring si senta 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 affrontano il mio problema fondamentale personale con Spring Security: i suoi nomi e concetti sono spesso confusi in generale a me. È difficile solo “capirlo”.

Nel secondo in cui inizi a usare Shiro, ti basta “capirlo”. 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. I cifrari) sono semplificate a un livello che non è solo sopportabile, ma spesso una gioia da usare.

Ad esempio, come si hash + sale una password e base64 lo codifica in Java o Spring Security? Né sono semplici e intuitive come la soluzione di Shiro:

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

Non c’è bisogno di comuni codec o altro. Solo il barattolo di Shiro.

Ora, per quanto riguarda gli ambienti Spring, la maggior parte degli sviluppatori Shiro utilizza Spring come ambiente di applicazione principale. Ciò significa che l’integrazione di Shiro’s Spring è superba e funziona in modo eccezionale. Puoi star certo che se stai scrivendo un’app di Spring, avrai un’esperienza di sicurezza a tutto tondo.

Ad esempio, considera l’esempio di configurazione XML di Spring in un altro post in questo thread. Ecco come faresti (essenzialmente) la stessa cosa in Shiro:

         /secure/** = authc /** = anon        ...  

Anche se un po ‘più prolisso rispetto all’altro esempio di Spring, è più facile leggere IMO.

Scoprirai anche che usare le definizioni della catena di filtri di Shiro è probabilmente il modo più semplice per definire le catene di filtri generali e le regole di sicurezza basate sul web di sempre! Molto più bello che definirli in web.xml.

Infine, Shiro offre anche estrema “agganciabilità”. Vedrai che puoi configurare e / o sostituire praticamente qualsiasi cosa a causa dell’architettura Shiro POJO / ad iniezione. Shiro imposta quasi tutto su impostazioni predefinite e puoi eseguire l’override o configurare solo ciò di cui hai bisogno.

Alla fine della giornata, penso che scegliere uno di questi due aspetti riguardi 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 Spring, quindi direi scegliere in base a quale dei due ti piace di più e ha più senso per te.

Per ulteriori informazioni sull’integrazione di Shiro’s Spring: http://shiro.apache.org/spring.html

Non ho esperienza con l’uso di Shiro e sono “parzialmente” d’accordo con ciò che hai detto su Spring Security. Prima di Spring Security 3.x, Spring Security (o Acegi) è stato molto doloroso da configurare. Una semplice configurazione basata sui ruoli richiede almeno 140 righe di configurazione XML criptica … Lo so perché in realtà ho contato le righe personalmente. È stato qualcosa in cui hai creato una volta e preghi che funzioni per sempre senza che tu tocchi di nuovo la configurazione, perché puoi assicurarti di aver dimenticato cosa significa tutta la configurazione. 🙂

Con Spring Security 3.x, è notevolmente migliorato. Introduce lo spazio security nomi di security che abbrevia drasticamente la configurazione da 140 linee a ~ 30 linee. Ecco un esempio di Spring Security 3.x di uno dei miei progetti: –

          ...      

La bellezza di Spring Security 3.x è estremamente configurabile, il che contribuisce a uno dei principali svantaggi: troppo complicato da comprendere. La documentazione non è facile da leggere perché ho familiarizzato solo parzialmente con alcuni dei termini utilizzati da Spring Security. Tuttavia, le opzioni sono disponibili se è necessario creare la configurazione personalizzata o controllare la granularità della sicurezza. In alternativa, è ansible rispettare le <30 linee precedenti per eseguire un controllo di sicurezza basato sui ruoli.

Quello che mi piace davvero di Spring Security è che una volta impostato, la sicurezza è integrata nel progetto senza soluzione di continuità. È come se il codice del progetto reale non conoscesse l’esistenza della sicurezza … e ciò è positivo, perché mi consente di staccare o aggiornare facilmente il componente di sicurezza in futuro (es: modifica dell’autenticazione del database su LDAP / CAS auth).

Stavo usando Spring Security (versione 3.1) per alcuni mesi ed ero abbastanza soddisfatto. È davvero potente e ha alcune funzionalità molto interessanti, specialmente dopo aver implementato tutto a mano come facevo prima! È stato però, come ho letto da qualche parte, una sorta di qualcosa che hai impostato una volta vicino all’inizio dell’aggiornamento dell’app, e poi preghi perché continui a funzionare fino alla fine, perché se devi andare a ripararlo lo farai probabilmente hai dimenticato la maggior parte delle cose che hai dovuto parametrare.

Ma poi è arrivato un nuovo progetto, con requisiti di sicurezza più complessi. In breve, abbiamo dovuto implementare una sorta di SSO personalizzato tra un paio di applicazioni web correlate.

Sapevo esattamente cosa volevo ottenere in termini di logica HTTP, cookie, ID di sessione e cose, e cosa doveva accadere in quale ordine, ma ho trascorso la parte migliore di una giornata alle prese con le API di Spring Security, e non riuscivo ancora a capire esattamente quale class o interfaccia devo implementare o sovrascrivere e come collegarli al contesto. L’intera API sembrava davvero complessa e un po ‘esotica a volte. E mentre il doc è abbastanza buono per i casi d’uso generali e anche alcune personalizzazioni, non è andato abbastanza in profondità per coprire i miei bisogni.

Dopo aver letto le risposte qui e in altri punti del web, ho avuto l’impressione che Shiro fosse più facile da capire e personalizzare secondo le mie esigenze. Quindi ho fatto un tentativo.

E sono contento di averlo fatto, perché dopo una giornata di lavoro sono riuscito a imparare abbastanza sulle API non solo per impostare un sistema di autenticazione e authorization di base nella mia webapp di Spring senza problemi, ma anche per implementare il comportamento SSO personalizzato che ero cercando. Ho solo dovuto estendere 2 o 3 classi, e il tutto ha richiesto solo circa 25 righe di configurazione XML nel mio contesto di spring.

Quindi, come conclusione, sugli aspetti di facilità d’uso e di curva di apprendimento, Shiro è davvero abbastanza simpatico, e penso che probabilmente lo seguirò in futuro, a meno che non incontri alcune caratteristiche carenti o qualche altro problema (che non ho finora).

TL; DR: Entrambi sono potenti, ma Shiro è molto più facile da imparare.