Shiro so với SpringSecurity [đã đóng]


132

Tôi hiện đang đánh giá các khung bảo mật dựa trên Java, tôi là người dùng Spring 3.0 nên có vẻ như SpringSecurance sẽ là lựa chọn đúng đắn, nhưng bảo mật Spring dường như bị phức tạp quá mức, có vẻ như nó không làm cho việc bảo mật dễ thực hiện hơn, Shiro dường như mạch lạc và dễ hiểu hơn nhiều. Tôi đang tìm kiếm danh sách ưu và nhược điểm giữa hai khung này.

Câu trả lời:


118

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


Tôi đã đọc tất cả điều này trước khi bắt đầu sử dụng shiro. Các chú thích của Shiro dường như gặp phải một số vấn đề trong mùa xuân. Thông tin về cách giải quyết nó rất hay và có nhiều bài đăng khác nhau trong stackoverflow (1 hoặc 2 do tôi tự đăng) mà hầu hết thời gian không tìm thấy câu trả lời. Tôi đã nghiêm túc nghĩ rằng tôi nên đi bảo mật mùa xuân mặc dù nó nói phức tạp, với điều đó tôi chắc chắn rằng tôi có thể có người chỉ cho tôi đi đúng hướng.
Sensei đen

@blacksensei bạn đã giải quyết các vấn đề bạn đề cập? Gắn bó với Shiro hay chuyển sang Spring Security?
Alexander Suraphel

Xin chào @AlexanderSuraphel Tôi đã không chuyển đến Spring cho dự án đó. Một đồng nghiệp đang tích cực sử dụng nó. Và tôi dự định thử nghiệm nó trong một dự án khởi động mùa xuân. Nó hoạt động độc đáo cho tôi. Tôi sẽ chuyển tất cả các dự án khác. Đơn giản như vậy
đen Sensei

Ok, tôi quyết định thử Shiro cho dự án tiếp theo !!
Eric Wang

32

Tôi không có kinh nghiệm sử dụng Shiro và tôi "một phần" đồng ý với những gì bạn nói về Spring Security. Trước Spring Security 3.x, Spring Security (hoặc Acegi) đã rất đau đớn khi thiết lập. Một cấu hình dựa trên vai trò đơn giản sẽ mất ít nhất 140 dòng cấu hình XML khó hiểu ... Tôi biết điều này bởi vì tôi thực sự đã tự đếm các dòng. Đó là thứ mà bạn thiết lập một lần và bạn cầu nguyện rằng nó sẽ hoạt động mãi mãi mà không cần bạn chạm lại vào cấu hình, bởi vì bạn có thể đảm bảo rằng bạn đã quên tất cả cấu hình có nghĩa là gì. :)

Với Spring Security 3.x, nó đã được cải thiện rất nhiều. Nó giới thiệu securitykhông gian tên rút ngắn đáng kể cấu hình từ 140 dòng xuống ~ 30 dòng. Đây là một ví dụ về Spring Security 3.x của một trong những dự án của tôi: -

<?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>

Cái hay của Spring Security 3.x là nó cực kỳ cấu hình, điều này góp phần vào một trong những nhược điểm chính: quá phức tạp để hiểu. Tài liệu này cũng không dễ đọc vì tôi chỉ quen một phần với một số thuật ngữ Spring Security được sử dụng. Tuy nhiên, các tùy chọn có ở đó nếu bạn cần tạo cấu hình tùy chỉnh hoặc kiểm soát mức độ chi tiết mà bạn muốn bảo mật của mình. Hoặc nếu không, bạn có thể sử dụng <30 dòng trên để thực hiện kiểm tra bảo mật dựa trên vai trò.

Điều tôi thực sự thích về Spring Security là một khi nó được thiết lập thì bảo mật được tích hợp vào dự án một cách liền mạch. Như thể mã dự án thực tế không biết đến sự tồn tại của bảo mật ... và điều đó là tốt, bởi vì nó cho phép tôi dễ dàng tách hoặc nâng cấp thành phần bảo mật trong tương lai (ví dụ: thay đổi cơ sở dữ liệu auth thành LDAP / CAS xác thực).


Bạn có muốn nói điều gì đó khi nào tốt khi chuyển từ bảo mật dựa trên container sang các lựa chọn thay thế như shiro hoặc những người khác không? Xem thêm câu hỏi tập trung tại đây: stackoverflow.com/questions/7782720/
Kẻ

10
Tôi đã thử cả an ninh shiro và mùa xuân, và cá nhân tôi cảm thấy shiro khá dễ hiểu khi bảo mật mùa xuân cảm thấy phức tạp. Tôi vẫn chưa tìm ra cách thiết lập quyền, mà tôi có thể gán cho vai trò / nhóm / người dùng trong bảo mật mùa xuân- (Tôi nghĩ ACL có thể là giải pháp). Với shiro thì khá dễ. Tôi không phải là chuyên gia về bảo mật mùa xuân hoặc shiro, đó chỉ là trải nghiệm cá nhân của tôi với tư cách là người dùng của cả hai.
Sudhir N

@sudhir bạn có gặp phải bất kỳ tắc nghẽn nào trong cấu hình của Shiro không?
Alexander Suraphel

Nó hoạt động cho tất cả các trường hợp người dùng của chúng tôi, tôi nghĩ rằng có thể điều chỉnh nó cho hầu hết các tình huống. Usecase của bạn là gì?
Sudhir N

21

Tôi đã sử dụng Spring Security (phiên bản 3.1) được vài tháng và khá hài lòng với nó. Nó thực sự mạnh mẽ và có một số tính năng rất hay, đặc biệt là sau khi thực hiện mọi thứ bằng tay như tôi đã làm trước đây! Mặc dù, giống như tôi đã đọc ở đâu đó, một thứ gì đó mà bạn đã thiết lập một lần gần đầu sự phát triển của ứng dụng, và sau đó cầu nguyện cho nó tiếp tục hoạt động cho đến khi kết thúc, bởi vì nếu bạn phải sửa nó, bạn sẽ phải sửa nó có lẽ đã quên hầu hết những thứ bạn phải tham số.

Nhưng sau đó, một dự án mới xuất hiện, với các yêu cầu bảo mật phức tạp hơn. Nói tóm lại, chúng tôi đã phải triển khai một số loại SSO tùy chỉnh giữa một vài ứng dụng web có liên quan.

Tôi biết chính xác những gì tôi muốn đạt được về logic HTTP, cookie, id phiên và nội dung và những gì sẽ xảy ra theo thứ tự, nhưng tôi đã dành phần tốt hơn trong một ngày vật lộn với API bảo mật mùa xuân, và vẫn không thể hiểu được ra chính xác lớp hoặc giao diện nào tôi sẽ thực hiện hoặc ghi đè, và cách cắm chúng vào ngữ cảnh. Đôi khi toàn bộ API cảm thấy rất phức tạp và đôi chút bí truyền. Và mặc dù tài liệu khá tốt cho các trường hợp sử dụng chung và thậm chí một số tùy chỉnh, nó không đủ sâu để đáp ứng nhu cầu của tôi.

Sau khi đọc câu trả lời ở đây và trên một số địa điểm khác trên web, tôi có ấn tượng rằng Shiro sẽ dễ hiểu và tùy chỉnh theo nhu cầu của tôi hơn. Vì vậy, tôi đã thử nó.

Và tôi rất vui vì tôi đã làm được, vì sau một ngày làm việc với nó, tôi đã học được đủ về các API không chỉ để thiết lập một hệ thống xác thực và ủy quyền cơ bản trong ứng dụng web Spring của tôi mà không gặp sự cố, mà còn để thực hiện hành vi SSO tùy chỉnh mà tôi đã tìm kiếm. Tôi chỉ phải mở rộng 2 hoặc 3 lớp và toàn bộ chỉ mất khoảng 25 dòng cấu hình XML trong bối cảnh mùa xuân của tôi.

Vì vậy, như một kết luận, về việc dễ sử dụng và học các khía cạnh đường cong, Shiro thực sự rất thích và tôi nghĩ rằng tôi có thể sẽ đi với nó trong tương lai, trừ khi tôi gặp phải một số tính năng thiếu hoặc một số vấn đề khác (mà tôi chưa có cho đến nay).

TL; DR: Cả hai đều mạnh mẽ, nhưng Shiro dễ học hơn nhiều.


Pierre, cảm ơn vì đầu vào. Tôi cũng cần sso. Tôi không cho rằng bạn có thể đưa ra một số ví dụ về những lớp bạn phải tiếp xúc.
KingAndrew

@KingAndrew: trong một vài từ, những gì tôi đã làm là triển khai AuthorizingRealm, xác thựcToken và xác thực của mình. Và tất cả các bộ lọc và hệ thống ống nước cần thiết. Nhưng những gì tôi làm không phải là "bình thường", nó dựa trên một mã thông báo được lưu trữ trong DB phổ biến giữa 2 ứng dụng. Vì vậy, tôi không sử dụng máy chủ SSO riêng biệt.
Pierre Henry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.