Shiro vs. SpringSecurity [closed]

je suis en train d'évaluer les cadres de sécurité basés sur Java, je suis un utilisateur de Spring 3.0 donc il semblait que SpringSecurity serait le bon choix, mais Spring security semble souffrir d'une complexité excessive, il ne semble certainement pas qu'il soit en train de rendre la sécurité plus facile à mettre en œuvre, Shiro semble être beaucoup plus cohérent et plus facile à comprendre. Je cherche des listes de pour et de contre entre ces deux cadres.

128
demandé sur Sean Patrick Floyd 2011-02-14 13:30:08

3 réponses

moi aussi je suis d'accord que la sécurité de printemps se sent trop compliquée (pour moi). Bien sûr, ils ont fait des choses pour réduire la complexité, comme créer des espaces de noms XML personnalisés pour réduire la quantité de configuration XML, mais pour moi, ceux-ci ne traitent pas mon problème fondamental personnel avec la sécurité de ressort: ses noms et concepts sont souvent déroutants en général pour moi. Il est difficile de juste"".

la seconde où vous commencez à utiliser Shiro cependant, vous venez de "l'obtenir". Ce qui était difficile à comprendre dans le monde de la sécurité est d'autant plus facile à comprendre. Les choses qui sont insupportablement difficiles à utiliser dans le JDK (par exemple les chiffreurs) sont simplifiées à un niveau qui n'est pas seulement supportable, mais souvent une joie à utiliser.

par exemple, comment hacher+saler un mot de passe et base64 l'encoder en sécurité Java ou Spring? Ni l'un ni l'autre ne sont aussi simples et intuitifs que la solution de Shiro:

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

pas besoin de commons-codec ou quoi que ce soit autre. Juste le Shiro jar.

en ce qui concerne maintenant les environnements de ressorts, la plupart des développeurs Shiro utilisent le ressort comme leur environnement d'application principal. Cela signifie que L'intégration du ressort de Shiro est superbe et que tout fonctionne exceptionnellement bien. Vous pouvez être assuré que si vous écrivez une application de printemps, vous aurez une expérience de sécurité bien équilibrée.

par exemple, considérez L'exemple de configuration XML dans un autre post de ce thread. Voici comment vous avez faire (essentiellement) la même chose dans 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>

bien que légèrement plus verbeux que l'autre exemple de ressort, il est plus facile à lire IMO.

vous constaterez également que les définitions des chaînes de filtrage de Shiro sont probablement la façon la plus facile de définir les chaînes de filtrage générales et les règles de sécurité basées sur le web! Bien mieux que de les définir dans web.XML.

enfin, Shiro offre une extrême " plug - bien. Vous verrez que vous pouvez configurer et/ou remplacer n'importe quoi à cause de L'architecture POJO / injection-friendly de Shiro. Par défaut, Shiro utilise presque tous les paramètres par défaut et vous pouvez modifier ou configurer seulement ce dont vous avez besoin.

à la fin de la journée, je pense que choisir l'un ou l'autre de ces deux est plus à propos de votre modèle mental - lequel des deux fait le plus de sens et est le plus intuitif pour vous? Pour certains, ce sera Shiro, pour d'autres ce sera le Printemps de Sécurité. Shiro fonctionne très bien au Printemps environnements, donc je dirais choisissez selon lequel des deux vous aimez plus et qui fait le plus de sens pour vous.

pour en savoir plus sur L'intégration de printemps de Shiro: http://shiro.apache.org/spring.html

114
répondu Les Hazlewood 2014-09-03 13:44:15

Je n'ai pas l'expérience de L'utilisation de Shiro, et je suis" en partie " d'accord avec ce que vous avez dit à propos de la sécurité du printemps. Avant la sécurité du ressort 3.x, Spring Security (ou Acegi) était très douloureux à installer. Une configuration simple basée sur les rôles prendra au moins 140 lignes de configuration XML cryptique... Je le sais parce que j'ai moi-même compté les lignes. C'était quelque chose où vous avez mis en place une fois, et vous priez que cela fonctionnera à jamais sans que vous touchiez à nouveau la configuration, parce que vous pouvez s'assurer que vous avez oublié ce que toute la configuration moyens. :)

Avec Ressort De Sécurité 3.x, il s'est énormément amélioré. Il introduit l'espace de noms security qui raccourcit considérablement la configuration de 140 lignes à ~30 lignes. Voici un exemple de Spring Security 3.x d'un de mes projets:-

<?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 beauté du Ressort de la Sécurité 3.x est il est extrêmement configurable, ce qui contribue à l'un des principaux inconvénients: trop compliqué à comprendre. La documentation n'est pas facile à lire non plus parce que je ne suis que partiellement familiarisé avec les Termes Spring Security utilisés. Cependant, les options sont là si vous avez besoin de créer votre configuration personnalisée ou de contrôler comment granulaire vous voulez que votre sécurité soit. Ou bien, vous pouvez vous en tenir aux lignes < 30 ci-dessus pour effectuer une vérification de sécurité basée sur les rôles.

ce que j'aime vraiment à propos de la sécurité de ressort est une fois qu'il est mis en place la sécurité est intégrée dans le projet transparente. C'est comme si le code du projet ne connaissait pas l'existence de la sécurité... et c'est bien, car cela me permet de détacher ou de mettre à jour facilement le composant de sécurité à l'avenir (ex: change database auth en LDAP/CAS auth).

31
répondu limc 2011-02-14 14:16:02

j'utilisais Spring Security (version 3.1) depuis quelques mois et j'en étais très satisfait. Il est vraiment puissant et a quelque fonctionnalité très agréable, surtout après avoir tout mis en œuvre à la main comme je l'ai fait avant ! Il était cependant, comme je l'ai lu quelque part, sorte de quelque chose que vous avez mis en place une fois près du début du développement de l'application, et puis prier pour lui de continuer à travailler jusqu'à la fin, parce que si vous devez aller le réparer, vous aurez probablement oublié la plupart des choses que vous aviez le paramètre.

mais ensuite un nouveau projet est arrivé, avec des exigences de sécurité plus complexes. En bref, nous avons dû mettre en œuvre une sorte de SSO personnalisé entre quelques webapps connexes.

je savais exactement ce que je voulais accomplir en termes de logique HTTP, cookies, id de session et autres, et ce qui devrait se passer dans quel ordre, mais j'ai passé la majeure partie de la journée à lutter avec les API de sécurité de printemps, et encore ne pouvait pas comprendre exactement ce que classe ou interface je devrais implémenter ou outrepasser, et comment les brancher dans le contexte. L'ensemble de L'API a semblé très complexe et parfois un peu ésotérique. Et bien que le doc soit assez bon pour les cas d'utilisation générale et même une certaine personnalisation, il n'est pas allé assez profond pour couvrir mes besoins.

Après avoir lu les réponses ici, et sur d'autres endroits sur le web, j'ai eu l'impression que Shiro serait plus facile à comprendre et l'adapter à mes besoins. Je lui ai donc donné un essai.

et je suis heureux que je l'ai fait, parce qu'après une journée de travail sur elle, j'ai réussi à en apprendre assez sur les API non seulement pour mettre en place un système d'authentification et d'autorisation de base dans mon webapp printemps sans problème, mais aussi pour mettre en œuvre le comportement SSO personnalisé que je cherchais. Je n'ai eu qu'à étendre 2 ou 3 classes, et le tout n'a pris qu'environ 25 lignes de config XML dans mon contexte de printemps.

comme conclusion, sur la facilité d'utilisation et les aspects de courbe d'apprentissage, Shiro est vraiment très sympathique, et je pense que je vais probablement aller avec elle dans le futur, à moins que je rencontre des caractéristiques manquantes ou un autre problème (que je n'ai pas jusqu'à présent).

TL;DR: les deux sont puissants, mais le Shiro est beaucoup plus facile à apprendre.

19
répondu Pierre Henry 2013-10-23 07:09:05