Saya juga setuju bahwa Spring Security terasa terlalu rumit (bagi saya). Tentu, mereka telah melakukan hal-hal untuk mengurangi kompleksitas, seperti membuat ruang nama XML khusus untuk mengurangi jumlah konfigurasi XML, tetapi bagi saya, ini tidak membahas masalah mendasar pribadi saya dengan Spring Security: nama dan konsepnya sering membingungkan secara umum untuk saya. Sulit untuk hanya 'mengerti'.
Namun begitu Anda mulai menggunakan Shiro, Anda cukup 'mengerti'. Apa yang sulit dipahami di dunia keamanan adalah jauh lebih mudah untuk dipahami. Hal-hal yang sulit untuk digunakan di JDK (mis. Ciphers) disederhanakan ke tingkat yang tidak hanya dapat ditanggung, tetapi seringkali menyenangkan untuk digunakan.
Sebagai contoh, bagaimana Anda + hash kata sandi dan base64 menyandikannya di Java atau Spring Security? Tidak ada yang sesederhana dan intuitif seperti solusi Shiro:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
Tidak perlu commons-codec atau apa pun. Hanya toples Shiro.
Sekarang berkaitan dengan lingkungan Spring, sebagian besar pengembang Shiro menggunakan Spring sebagai lingkungan aplikasi utama mereka. Itu berarti integrasi Musim Semi Shiro luar biasa dan semuanya bekerja dengan sangat baik. Anda dapat yakin bahwa jika Anda menulis aplikasi Musim Semi, Anda akan memiliki pengalaman keamanan yang menyeluruh.
Misalnya, pertimbangkan contoh konfigurasi Spring XML di pos lain di utas ini. Inilah cara Anda melakukan (pada dasarnya) hal yang sama di 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>
Meskipun sedikit lebih bertele-tele daripada contoh Spring lainnya, lebih mudah untuk membaca IMO.
Anda juga akan menemukan menggunakan definisi rantai filter Shiro mungkin cara termudah untuk mendefinisikan rantai filter umum dan aturan keamanan berbasis web yang pernah ada! Jauh lebih bagus daripada mendefinisikannya di web.xml.
Akhirnya, Shiro juga menawarkan 'pluggability' yang ekstrem. Anda akan melihat bahwa Anda dapat mengonfigurasi dan / atau mengganti apa saja karena arsitektur POJO / injeksi ramah Shiro. Shiro default hampir semuanya menjadi waras default dan Anda dapat menimpa atau mengkonfigurasi hanya apa yang Anda butuhkan.
Pada akhirnya, saya pikir memilih salah satu dari keduanya adalah tentang model mental Anda - mana dari keduanya yang lebih masuk akal dan lebih intuitif untuk Anda? Untuk beberapa itu akan menjadi Shiro, untuk yang lain itu akan menjadi Spring Security. Shiro bekerja sangat baik di lingkungan Musim Semi, jadi saya akan mengatakan pilih berdasarkan mana dari dua yang paling Anda sukai dan yang paling masuk akal bagi Anda.
Untuk informasi lebih lanjut tentang integrasi Musim Semi Shiro: http://shiro.apache.org/spring.html