Shiro vs. SpringSecurity [zamknięta]

Obecnie oceniam frameworki bezpieczeństwa oparte na Javie, jestem użytkownikiem Spring 3.0, więc wydawało się, że SpringSecurity będzie właściwym wyborem, ale Spring security wydaje się cierpieć z powodu nadmiernej złożoności, to na pewno nie wydaje się, aby to czyni bezpieczeństwo łatwiejsze do wdrożenia, Shiro wydaje się być znacznie bardziej spójne i łatwiejsze do zrozumienia. Szukam list za i przeciw między tymi dwoma frameworkami.

Author: Sean Patrick Floyd, 2011-02-14

3 answers

Ja też się Zgadzam, że wiosenna Ochrona wydaje mi się zbyt skomplikowana (dla mnie). Oczywiście, zrobili coś w celu zmniejszenia złożoności, jak tworzenie niestandardowych przestrzeni nazw XML w celu zmniejszenia ilości konfiguracji XML, ale dla mnie, nie dotyczą one mojego osobistego fundamentalnego problemu z zabezpieczeniami Spring: jego nazwy i pojęcia są często mylące ogólnie dla mnie. Trudno po prostu "dostać".

Gdy tylko zaczniesz używać Shiro, po prostu to zrozumiesz. Co trudno było zrozumieć w świat bezpieczeństwa jest o wiele łatwiejszy do zrozumienia. Rzeczy, które są nieznośnie trudne w użyciu w JDK (np. szyfry) są uproszczone do poziomu, który jest nie tylko znośny, ale często radość z użytkowania.

Na przykład, jak hashować + solić hasło i base64 zakodować je w Javie lub Spring Security? Nie są tak proste i intuicyjne jak rozwiązanie Shiro: {]}

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

Nie ma potrzeby używania commons-codec ani czegokolwiek innego. Tylko słoik Shiro.

Teraz z pozdrowieniami dla wiosny środowiska, większość programistów Shiro używa Springa jako podstawowego środowiska aplikacji. Oznacza to, że wiosenna integracja Shiro jest doskonała i wszystko działa wyjątkowo dobrze. Możesz mieć pewność, że pisząc aplikację Spring, będziesz mieć dobrze zaokrąglone wrażenia bezpieczeństwa.

Na przykład, rozważmy przykład Spring XML config w innym poście w tym wątku. Oto jak zrobiłbyś (zasadniczo) to samo w 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>

Chociaż nieco więcej bardziej wyrazisty niż w innym przykładzie wiosny, jest łatwiejszy do odczytania IMO.

Znajdziesz również użycie definicji łańcucha filtrów Shiro jest prawdopodobnie najprostszym sposobem na zdefiniowanie ogólnych łańcuchów filtrów i internetowych reguł bezpieczeństwa kiedykolwiek! Dużo ładniejsze niż definiowanie ich w sieci.xml.

Wreszcie, Shiro oferuje również ekstremalną "pluggability". Zobaczysz, że możesz skonfigurować i / lub zastąpić prawie wszystko dzięki architekturze Shiro POJO / injection-friendly. Shiro domyślnie prawie wszystko aby rozsądne domyślne i można zastąpić lub skonfigurować tylko to, czego potrzebujesz.

Na koniec dnia, myślę, że wybór jednego z tych dwóch bardziej dotyczy Twojego modelu mentalnego - który z nich ma większy sens i jest dla ciebie bardziej intuicyjny? Dla jednych będzie to Shiro, dla innych będzie to wiosenne bezpieczeństwo. Shiro świetnie sprawdza się w wiosennych warunkach, więc powiedziałbym, że wybieraj w oparciu o to, który z nich najbardziej Ci się podoba i który ma dla Ciebie największy sens.

Więcej o wiosennej integracji Shiro: http://shiro.apache.org/spring.html
 114
Author: Les Hazlewood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 13:44:15

Nie mam doświadczenia w używaniu Shiro i" częściowo " zgadzam się z tym, co powiedziałeś o Spring Security. Przed wiosenną ochroną 3.x, Spring Security (lub Acegi) było bardzo bolesne, aby skonfigurować. Prosta konfiguracja oparta na rolach zajmie co najmniej 140 linii cryptic XML configuration... Wiem o tym, bo sam liczyłem linijki. To było coś, gdzie skonfigurować jeden raz, i modlić się, że będzie działać na zawsze bez dotykania konfiguracji ponownie, ponieważ można zapewnić zapomniałeś, co oznacza cała konfiguracja. :)

Z Zabezpieczeniem Sprężynowym 3.x, znacznie się poprawiło. Wprowadza przestrzeń nazw security, która drastycznie skraca konfigurację ze 140 linii do ~30 linii. Oto przykład Spring Security 3.x jednego z moich projektów: -
<?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>
Piękno wiosennej ochrony 3.x jest bardzo konfigurowalny, co przyczynia się do jednego z głównych minusów: zbyt skomplikowane do zrozumienia. Dokumentacja też nie jest łatwa do odczytania ponieważ jestem tylko częściowo zaznajomiony z niektórymi terminami Spring Security używanymi. Opcje są jednak dostępne, jeśli chcesz utworzyć niestandardową konfigurację lub kontrolować, jak szczegółowe mają być twoje zabezpieczenia. W przeciwnym razie możesz trzymać się powyższych

To, co naprawdę lubię w Spring Security, to to, że po jego skonfigurowaniu bezpieczeństwo jest bezproblemowo zintegrowane z projektem. To tak, jakby rzeczywisty kod projektu nie wiedział o istnieniu ochrony... i to jest dobre, ponieważ pozwala mi łatwo odłączyć lub uaktualnić komponent bezpieczeństwa w przyszłości(np. zmienić auth bazy danych na LDAP / CAS auth).

 31
Author: limc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-14 14:16:02

Używałem Spring Security (Wersja 3.1) od kilku miesięcy i byłem z niego całkiem zadowolony. Jest naprawdę potężny i ma bardzo ładną funkcję, zwłaszcza po ręcznym wdrożeniu wszystkiego, tak jak wcześniej ! Było to jednak, jak gdzieś czytałem, coś w rodzaju czegoś, co skonfigurowałeś kiedyś na początku rozwoju aplikacji, a następnie módl się, aby działało do końca, ponieważ jeśli musisz to naprawić, prawdopodobnie zapomnisz większość rzeczy, które miałeś do zrobienia. parametr.

Ale potem pojawił się nowy projekt, z bardziej złożonymi wymaganiami bezpieczeństwa. Krótko mówiąc, musieliśmy wdrożyć jakiś rodzaj niestandardowego SSO między kilkoma powiązanymi webapps.

Wiedziałem dokładnie, co chcę osiągnąć pod względem logiki HTTP, plików cookie, identyfikatorów sesji i innych rzeczy, i co powinno się wydarzyć w jakiej kolejności, ale spędziłem większą część dnia zmagając się z API zabezpieczeń Spring i nadal nie mogłem dowiedzieć się dokładnie, jaką klasę lub interfejs powinienem zaimplementować lub zaimplementować. override, i jak podłączyć je w kontekście. Całe API wydawało się bardzo złożone i czasami trochę Ezoteryczne. I chociaż doc jest całkiem dobry do ogólnych przypadków użycia, a nawet niektórych dostosowań, nie wszedł wystarczająco głęboko, aby pokryć moje potrzeby.

Po przeczytaniu odpowiedzi tutaj i w innych miejscach w sieci, odniosłem wrażenie, że Shiro będzie łatwiej zrozumieć i dostosować do moich potrzeb. Więc spróbowałem.

I cieszę się, że to zrobiłem, bo po dniu pracy nad nim udało się dowiedzieć wystarczająco dużo o API nie tylko skonfigurować podstawowy system uwierzytelniania i autoryzacji w mojej wiosennej webapp bez problemów, ale także wdrożyć niestandardowe zachowanie SSO Szukałem. Musiałem tylko rozszerzyć 2 lub 3 klasy, a całość zajęła tylko około 25 linijek konfiguracji XML w moim wiosennym kontekście.

Na zakończenie, co do łatwości obsługi i uczenia się, Shiro jest naprawdę całkiem sympatyczny i myślę, że w przyszłości się z nim zgodzę, chyba że Napotykam pewne braki funkcji lub jakiś inny problem (którego do tej pory nie miałem).

TL;DR: oba są potężne, ale Shiro jest znacznie łatwiejszy do nauczenia się.

 19
Author: Pierre Henry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 07:09:05