2009-08-19 21 views

Trả lời

6

Kết quả cuối cùng bạn muốn là có thể, tôi đã chạy vào mà cùng một vấn đề chính xác và đây là giải pháp của tôi.

Bất cứ lúc nào khi xác định đăng nhập biểu mẫu trong không gian tên, nó sẽ tự động ghi đè bất kỳ bộ lọc xác thực nào khác mà bạn áp dụng qua không gian tên. Điều này được thực hiện thông qua thứ tự của chuỗi bộ lọc nhìn vào FilterChainOrder.java trong bảo mật mùa xuân để xem thứ tự thực sự được áp dụng như thế nào cho mỗi bộ lọc.

Để giải quyết vấn đề này, hãy xóa thẻ http cơ bản khỏi không gian tên, sau đó xác định bean để xử lý xác thực cơ bản và đặt hàng trước AuthenticationProcessingFilter vì đây là bộ lọc bảo mật mùa xuân sẽ xử lý đăng nhập biểu mẫu.

Dòng BasicProcessingFilter cung cấp để xử lý Xác thực cơ bản là bộ lọc thụ động, có nghĩa là nếu thông tin đăng nhập bị thiếu, nó sẽ tiếp tục xuống chuỗi lọc cho đến khi tìm thấy bộ lọc thích hợp để xử lý yêu cầu.

Bây giờ bằng cách xác định thủ công hạt BasicProcessingFilter chúng ta có thể đặt thứ tự nó sẽ xuất hiện trong chuỗi bộ lọc. Dưới đây là một ví dụ về khai báo xml bổ sung mà bạn sẽ cần phải cung cấp trong xml an ninh (Xuân An < 3.x)

<bean id="basicProcessingFilter" class="org.springframework.security.ui.basicauth.BasicProcessingFilter"> 
    <property name="authenticationManager"><ref bean="authenticationManager"/></property> 
    <security:custom-filter before="AUTHENTICATION_PROCESSING_FILTER"/> 
    <property name="authenticationEntryPoint"><ref bean="authenticationEntryPoint"/></property> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint"> 
       <property name="realmName" value="My Realm Here"/> 
</bean> 

Cũng lưu ý nếu tham khảo authenticationManager của bạn không tìm thấy bạn có thể thêm một bí danh để không gian tên của bạn giống như không gian tên bên dưới.

<security:authentication-manager alias="authenticationManager"/> 

Kết quả cuối cùng là bộ lọc cơ bản sẽ được áp dụng như một bộ lọc thụ động và nếu thông tin cần thiết của nó đang thiếu nó sẽ tiếp tục xuống chuỗi bộ lọc và bộ lọc hình thức đăng nhập sau đó sẽ xử lý nó.

Vấn đề với cách tiếp cận này là nếu thông tin xác thực được nhập chính xác, phản hồi trở lại là trang đăng nhập từ bộ lọc đăng nhập biểu mẫu.

Tuy nhiên, Có vẻ như vấn đề này sẽ được khắc phục vào mùa xuân ở phiên bản 3.1 của bảo mật mùa xuân và công việc này sẽ không còn cần thiết nữa.

10

response by @grimesjm là đúng. Tuy nhiên, nếu bạn đang sử dụng Spring 3.x bạn phải thích ứng với tên lớp để:

<bean id="basicProcessingFilter" class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager"> 
     <ref bean="authenticationManager" /> 
    </property> 
    <property name="authenticationEntryPoint"> 
     <ref bean="authenticationEntryPoint" /> 
    </property> 
</bean> 

<bean id="authenticationEntryPoint" 
    class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> 
    <property name="realmName" value="Your realm here" /> 
</bean> 

<sec:http auto-config="true"> 
    ... your intercept-url here 

    <sec:custom-filter before="SECURITY_CONTEXT_FILTER" ref="basicProcessingFilter" /> 

    <sec:form-login ... /> 
    .... 
</sec:http> 

Tôi không biết liệu việc đặt các bộ lọc trước khi SECURITY_CONTEXT_FILTER là lựa chọn tốt nhất hay không .

1

Giờ đây bạn có thể thực hiện với Bảo mật mùa xuân 3.1.0

+1

Điều này là đúng, đây là một liên kết sẽ mở rộng trên câu trả lời này: http://stackoverflow.com/questions/3671861/two-realms-in-same-application-with-spring-security –

+0

Tôi nghĩ rằng mục tiêu là có REST API hỗ trợ cả hai xác thực trong cùng một lĩnh vực. Xác định hai cõi giống như xác định hai cuộc chiến tranh - nó hoạt động nhưng nó không lý tưởng. – Eugen

Các vấn đề liên quan