Tôi cũng đồng ý rằng Spring Security cảm thấy quá phức tạp (với tôi). Chắc chắn, họ đã làm mọi thứ để giảm độ phức tạp, như tạo các không gian tên XML tùy chỉnh để giảm số lượng cấu hình XML, nhưng đối với tôi, chúng không giải quyết vấn đề cơ bản cá nhân của tôi với Spring Security: nói chung tên và khái niệm của nó thường khó hiểu tôi. Thật khó để chỉ "lấy nó".
Lần thứ hai bạn bắt đầu sử dụng Shiro, bạn chỉ cần 'hiểu được'. Điều khó hiểu trong thế giới bảo mật chỉ là dễ hiểu hơn nhiều. Những thứ khó sử dụng trong JDK (ví dụ: Mật mã) được đơn giản hóa đến mức không chỉ chịu đựng được mà thường là niềm vui khi sử dụng.
Ví dụ: làm thế nào để bạn băm + muối mật khẩu và cơ sở mã hóa 64 trong Java hoặc Spring Security? Không đơn giản và trực quan như giải pháp của Shiro:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
Không cần commons-codec hoặc bất cứ điều gì khác. Chỉ là bình Shiro.
Bây giờ liên quan đến môi trường Spring, hầu hết các nhà phát triển Shiro sử dụng Spring làm môi trường ứng dụng chính của họ. Điều đó có nghĩa là sự tích hợp Mùa xuân của Shiro là tuyệt vời và tất cả đều hoạt động rất tốt. Bạn có thể yên tâm rằng nếu bạn đang viết một ứng dụng Spring, bạn sẽ có trải nghiệm bảo mật toàn diện.
Ví dụ, hãy xem xét ví dụ cấu hình Spring XML trong một bài đăng khác trong chuỗi này. Đây là cách bạn làm (về cơ bản) điều tương tự trong 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>
Mặc dù dài dòng hơn một chút so với ví dụ Spring khác, việc đọc IMO dễ dàng hơn.
Bạn cũng sẽ thấy sử dụng định nghĩa chuỗi bộ lọc của Shiro có lẽ là cách dễ nhất để xác định chuỗi bộ lọc chung và quy tắc bảo mật dựa trên web từ trước đến nay! Đẹp hơn nhiều so với định nghĩa chúng trong web.xml.
Cuối cùng, Shiro cũng cung cấp 'khả năng cắm' cực cao. Bạn sẽ thấy rằng bạn có thể định cấu hình và / hoặc thay thế bất cứ thứ gì vì kiến trúc POJO / thân thiện với tiêm của Shiro. Shiro mặc định hầu hết mọi thứ để mặc định và bạn chỉ có thể ghi đè hoặc định cấu hình những gì bạn cần.
Vào cuối ngày, tôi nghĩ rằng việc chọn một trong hai điều này sẽ liên quan nhiều hơn đến mô hình tinh thần của bạn - điều nào trong hai điều này có ý nghĩa hơn và trực quan hơn đối với bạn? Đối với một số người, đó sẽ là Shiro, đối với những người khác, đó sẽ là Bảo mật mùa xuân. Shiro hoạt động tuyệt vời trong môi trường mùa xuân, vì vậy tôi sẽ nói chọn dựa trên cơ sở nào trong hai bạn thích hơn và có ý nghĩa nhất với bạn.
Để biết thêm về tích hợp Mùa xuân của Shiro: http://shiro.apache.org/spring.html