J'évalue actuellement les frameworks de sécurité basés sur Java, je suis un utilisateur de Spring 3.0, il semblait donc que SpringSecurity serait le bon choix, mais la sécurité de Spring semble souffrir d'une complexité excessive. Shiro semble être beaucoup plus cohérent et plus facile à comprendre. Je recherche des listes de pour et de contre entre ces deux cadres.
Réponses
Trop de publicités?J'ai trop d'accord que le Printemps de Sécurité se sent trop compliqué (pour moi). Bien sûr, ils ont fait des choses pour réduire la complexité, comme la création des espaces de noms XML pour réduire la quantité de configuration XML, mais pour moi, ce n'est pas l'adresse de mon personnel problème fondamental avec le Printemps de Sécurité: ses noms et les concepts sont souvent source de confusion en général pour moi. Il est difficile de juste"".
La deuxième vous commencez à utiliser Shiro bien, vous venez 'obtenir'. Ce qui était difficile à comprendre dans le monde de la sécurité est d'autant plus facile à comprendre. Les choses qui sont insupportablement difficile à utiliser dans le JDK (par exemple, les Algorithmes) sont simplifiées à un niveau qui n'est pas seulement supportable, mais, souvent, une joie à utiliser.
Par exemple, comment avez vous de hachage+sel un mot de passe et l'encoder en base64 dans le Java ou le Printemps de Sécurité? Ne sont ni aussi simple et intuitif que Shiro est solution de:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
Pas besoin de commons-codec ou quoi que ce soit d'autre. Juste le Shiro jar.
Maintenant en ce qui concerne le Printemps des environnements, la plupart des Shiro aux développeurs d'utiliser le Printemps comme leur principale application de l'environnement. Cela signifie que Shiro est le Printemps de l'intégration est superbe et tout fonctionne exceptionnellement bien. Vous pouvez être assuré que si vous écrivez un Printemps application, vous aurez une bonne expérience en matière de sécurité.
Par exemple, considérons le Printemps de configuration XML exemple dans un autre post dans ce thread. Voici comment vous pouvez le faire (essentiellement) la même chose que 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 détaillé que les autres ressorts exemple, il est plus facile de lire l'OMI.
Vous trouverez également à l'aide de Shiro filtre de la chaîne d'définitions sont probablement la façon la plus simple de définir les chaînes de filtres sur le web et les règles de sécurité jamais! Beaucoup plus agréable que de les définir dans le web.xml.
Enfin, Shiro propose extrême "pluggability'. Vous verrez que vous pouvez configurer et/ou de remplacer juste au sujet de n'importe quoi parce que de Shiro de POJO/injection respectueux de l'architecture. Shiro par défaut presque tout sain d'esprit des valeurs par défaut et vous pouvez remplacer ou de configurer uniquement ce dont vous avez besoin.
À la fin de la journée, je pense que le choix de l'une de ces deux est le plus à propos de votre modèle mental, dont les deux plus de sens et est plus intuitive 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 Shiro est le Printemps de l'intégration: http://shiro.apache.org/spring.html
Je n'ai pas d'expérience à l'aide de Shiro, et je "en partie" d'accord avec ce que vous avez dit au sujet de la Sécurité Printemps. Avant le Printemps de Sécurité 3.x, le Printemps de Sécurité (ou d'Acegi) a été très pénible à mettre en place. Un simple rôle de configuration basée sur le prendra au moins 140 lignes de cryptic de configuration XML... je le sais parce que j'ai réellement compté les lignes de moi-même. C'était quelque chose où vous définissez un temps, et vous prie que cela ne fonctionne jamais sans vous toucher la configuration à nouveau, parce que vous pouvez vous assurer que vous avez oublié ce que toute la configuration moyens. :)
Avec Ressort De Sécurité 3.x, il a énormément amélioré. Il introduit security
d'espace de noms qui abrègent la configuration à partir de 140 lignes de ~30 lignes. Voici un exemple de Printemps de la Sécurité 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, soit parce que je suis que partiellement familier avec certaines des conditions du Ressort de Sécurité utilisé. Cependant, les options sont là si vous avez besoin pour créer votre configuration personnalisée de la gestion ou contrôle précis que vous voulez que votre sécurité. Sinon, vous pouvez coller avec le ci-dessus < 30 lignes pour effectuer une sécurité basée sur les rôles vérifier.
Ce que j'aime vraiment à propos de la Sécurité Printemps est une fois qu'il est configuré de la sécurité est intégrée dans le projet de façon transparente. C'est comme si le projet de code ne connaît pas l'existence de la sécurité... et c'est bien parce que ça me permet de facilement se détacher ou de mettre à niveau le composant de sécurité dans le futur (ex: changement de la base de données d'authentification LDAP/CAS auth).
J'avais été en utilisant Spring Security (version 3.1) pendant quelques mois et il était très heureux avec elle. Il est vraiment puissant et a une certaine caractéristique très intéressante, surtout après la mise en œuvre de tout à la main comme je le faisais avant ! Il a été bien que, comme je l'ai lu quelque part, une sorte de quelque chose que vous avez défini une fois près du début de la develoepment de l'app, et puis prier pour elle de continuer à travailler jusqu'à la fin, parce que si vous devez aller le réparer vous aurez probablement oublié la plupart des choses, vous avez dû paramètre.
Mais alors, un nouveau projet est venu, avec en plus complexes en matière de sécurité. En bref, nous avons dû mettre en place une sorte de coutume d'authentification unique entre un couple d'liées webapps.
Je savais exactement ce que je voulais obtenir en termes de HTTP logique, les cookies, l'id de session et des choses, et ce qui doit arriver dans quel ordre, mais j'ai passé la meilleure partie de la journée de la difficulté avec le Printemps des Api de Sécurité, et encore ne pouvait pas comprendre exactement ce que la classe ou de l'interface, je devrait mettre en œuvre ou de la remplacer, et la façon de les combler dans le contexte. L'ensemble de l'API sentais vraiment complexe et un peu ésotérique à la fois. Et alors que la doc est assez bonne pour l'ensemble des cas d'utilisation et même un certain degré de personnalisation, il ne va pas 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 j'ai fait, car après une journée de travail sur elle, j'ai réussi à en apprendre suffisamment sur les Api non seulement de configurer une authentification de base et le système d'autorisation dans mon Printemps webapp sans problème, mais aussi pour mettre en œuvre la SSO personnalisé comportement que je cherchais. Je n'avais qu'à étendre de 2 ou 3 classes, et le tout a pris environ 25 lignes de XML de config dans mon printemps contexte.
Donc, en conclusion, sur la facilité d'utilisation et la courbe d'apprentissage des aspects, Shiro est vraiment très sympathique, et je pense que je vais probablement aller avec elle dans l'avenir, à moins que je rencontre certaines fonctionnalités manquent ou d'un autre problème (que je n'ai pas jusqu'à présent).
TL;DR: les Deux sont puissants, mais Shiro est beaucoup plus facile à apprendre.