2010-09-08 35 views
17

Chúng tôi đang xây dựng một ứng dụng web có sẵn cho cả người dùng được xác thực và ẩn danh. Nếu bạn quyết định không đăng ký/đăng nhập, bạn chỉ có một tập hợp các tính năng hạn chế. Xác thực người dùng được thực hiện qua OpenID với Spring Security. Điều đó hoạt động tốt.Hai cõi trong cùng một ứng dụng với Spring Security?

Tuy nhiên, ứng dụng cũng đi kèm với giao diện người dùng quản trị được triển khai tại <host>/<context-root>/admin. Chúng ta có thể có hai cõi riêng biệt với Spring Security (ví dụ: auth cơ bản cho /admin/**)? Làm thế nào mà phải được cấu hình?

Trả lời

18

Bảo mật mùa xuân đã thêm hỗ trợ cho trường hợp này trong phiên bản 3.1, hiện có sẵn dưới dạng Ứng viên phát hành. Nó được thực hiện bởi SEC-1171 và các chi tiết của cú pháp nằm trong sách hướng dẫn đi kèm với 3.1.

Tuy nhiên nó khá đơn giản để sử dụng. Về cơ bản, bạn chỉ cần xác định nhiều phần tử http trong cấu hình Spring Security của mình, một cho mỗi lĩnh vực. Chúng tôi đang sử dụng nó như thế này:

<!-- Configure realm for system administration users --> 
<security:http pattern="/admin/**" create-session="stateless"> 
    <security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" /> 
    <security:http-basic/> 
</security:http> 


<!-- Configure realm for standard users --> 
<security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired"> 
    <security:form-login login-page="/login" 
      ... 
      ... 
</security:http> 

Điều quan trọng cần lưu ý là pattern="/admin/**" trên các yếu tố đầu tiên http. Điều này cho biết rằng tất cả các URL dưới /admin phải tuân theo lĩnh vực đó thay vì lĩnh vực mặc định - và do đó, các URL dưới /admin sử dụng xác thực cơ bản để thay thế.

+0

Tôi đã cố gắng tìm hiểu cách thực hiện chính xác điều này, cảm ơn vì đã chỉ ra rõ ràng! –

+1

Bảo mật mùa xuân 3.1.0 đã được chính thức phát hành vào ngày 7/12/2011 – lrkwz

+0

Tôi đang làm chính xác điều này và nếu tôi đăng nhập vào phần quản trị, tôi cũng đã đăng nhập vào phần người dùng nhưng không được ủy quyền (tất nhiên). Tôi nghĩ rằng điều này là do an ninh mùa xuân giữ quyền trong phiên theo một khóa. Có cách nào để cấu hình bảo mật mùa xuân cho kịch bản mà bạn có thể đăng nhập vào phần quản trị và người dùng cùng một lúc với thực thể ủy quyền khác không? –

0

Tôi không thể nghĩ ra một cách thẳng về phía trước có hai cõi (và tôi đã không thử nó bản thân mình):

bạn có thể xác định hai bộ lọc in your web.xml nơi mỗi người có một cấu hình mùa xuân khác nhau và ergo một môi trường riêng. Những điều toàn cầu đi vào cấu hình ứng dụng, lĩnh vực cụ thể trong cấu hình bộ lọc.

nếu chỉ dành cho phương thức xác thực khác, bạn có thể write your own filter sau đó quyết định bộ lọc nào sẽ gọi.

1

giải pháp có thể:

  • Thêm đánh chặn URL cho /admin đòi hỏi "ROLE_ADMIN"
  • Configure thể hiện của org.springframework.security.web.authentication.www.BasicAuthenticationFilter để đánh chặn các URL /admin và xác thực người dùng như ROLE_ADMIN nếu nó cung cấp các thông tin thích hợp

Cấu hình mẫu:

<security:intercept-url pattern="/admin" access="ROLE_ADMIN"/> 

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

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

Lưu ý: việc triển khai mặc định BasicAuthenticationFilter là một bộ lọc thụ động, tức là nó chỉ tìm tiêu đề xác thực cơ bản trong yêu cầu và nếu nó không có mặt - không làm gì cả. Nếu bạn muốn các bộ lọc để yêu cầu một cách rõ ràng xác thực cơ bản từ các khách hàng, bạn cần phải mở rộng việc thực hiện mặc định để bắt đầu để xác thực điểm vào:

public class BasicAuthenticationFilter 
     extends org.springframework.security.web.authentication.www.BasicAuthenticationFilter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

     final HttpServletRequest request = (HttpServletRequest) req; 
     final HttpServletResponse response = (HttpServletResponse) res; 

     String header = request.getHeader("Authorization"); 

     if ((header != null) && header.startsWith("Basic ")) { 
      super.doFilter(req, res, chain); 
     } else { 
      getAuthenticationEntryPoint().commence(request, response, new AuthenticationCredentialsNotFoundException("Missing credentials")); 
     } 
    } 
} 

Bên cạnh đó, bạn cần phải tinh chỉnh bộ lọc để áp dụng cho /admin URL chỉ - hoặc bằng cách mã hóa cứng trong phương thức doFilter hoặc bằng cách cung cấp một bean wrapper thích hợp.

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