2012-04-30 55 views
5

Tôi đang cố gắng hiểu cách được xác định lại để xác định Spring Security trong các ứng dụng Spring-MVC, nơi các định nghĩa bean được phân chia trên nhiều bối cảnh cha/con.Spring Security + MVC: Các câu hỏi xung quanh định nghĩa ngữ cảnh và phạm vi đậu

Ví dụ, ứng dụng hiện tại của tôi web.xml trông như sau, (mà tôi hiểu là khá chuẩn)

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
    classpath:applicationContext.xml 
    /WEB-INF/securityContext.xml 
    </param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<servlet> 
    <servlet-name>spring-mvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>spring-mvc</servlet-name> 
    <url-pattern>/app/*</url-pattern> 
</servlet-mapping> 

Vì vậy, tôi có một tiêu chuẩn ContextLoaderListener quy định tại /, mà tải configs toàn cầu của tôi - applicationContext.xmlsecurityContext.xml. Tôi cũng xác định mvc mùa xuân DispatcherServlet tại /app/, tải hạt đậu của riêng nó từ spring-mvc-servlet.xml.

Như tôi đã hiểu, cấu hình được xác định trong spring-mvc-servlet.xml không hiển thị với cấu hình được xác định trong tệp ngữ cảnh cấp cao nhất.

Vị trí tốt nhất để xác định khái niệm bảo mật cấp ứng dụng ở đâu? Ví dụ: tôi muốn thêm bộ lọc sau.

<security:http pattern="/oauth/token" create-session="stateless" entry-point-ref="oauthAuthenticationEntryPoint"> 
    <security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" /> 
</security:http> 

Đây là yêu cầu để /app/oauth/token chuyển qua bộ lọc này và nhận được xác thực cơ bản được xử lý.

Vì điều này liên quan trực tiếp đến mối quan tâm của ứng dụng Spring-MVC, ban đầu tôi xác định nó trong spring-mvc-context.xml (đó là lý do tại sao app bị loại trừ khỏi url).

Tuy nhiên, điều này có nghĩa là nó không hiển thị với cấu hình bảo mật được xác định trong securityContext.xml, do đó, nó bị bỏ qua.

Vì vậy, tôi di chuyển nó lên đến securityContext.xml, nhưng khi làm như vậy, cũng phải di chuyển tất cả các phụ thuộc. Tôi nhanh chóng kết thúc việc di chuyển mọi thứ lên đến applicationContext.xml, để lại spring-mvc-context.xml gần như trống.

Điều này có phổ biến không? Sự chia rẽ được đề xuất giữa những gì được xác định trong các bối cảnh cấp cao nhất và những gì được xác định trong ngữ cảnh con?

Cho rằng spring-mvc định nghĩa một loạt các bộ điều khiển mà tôi muốn đánh dấu là @Secured, chúng sẽ được xử lý như thế nào nếu bộ điều khiển không hiển thị trong bối cảnh bảo mật?

Tôi có cần phải di chuyển <mvc:annotation-driven /> của mình từ servlet.xml tới toàn cầu applicationContext.xml không? Tôi có cần cấu hình bổ sung trong số spring-mvc-servlet.xml để yêu cầu nó tham gia bảo mật mùa xuân không?

Tôi đã đọc số documentation on Spring-MVC, nhưng có rất ít chi tiết cụ thể về cách định cấu hình này. Ngoài ra, các Spring OAuth examples dường như để xác định tất cả mọi thứ trong một tập tin cấu hình duy nhất, mà không có vẻ rất thực tế, và dường như mâu thuẫn với các ví dụ khác tôi đã đọc.

Trả lời

7

Đầu tiên: các hạt được xác định trong applicationContext.xml (ContextLoaderListener) không thể truy cập được xác định trong spring-mvc-servlet.xml (DispatcherServlet) nhưng không phải theo cách khác.

Bạn hỏi:


Cho rằng mùa xuân-MVC định nghĩa một loạt các bộ điều khiển, mà tôi muốn đánh dấu như @Secured, làm thế nào chúng sẽ được xử lý nếu bộ điều khiển không nhìn thấy được đối với an ninh bối cảnh?

Vì vậy, các công trình này mà không có vấn đề, bởi vì các bộ điều khiển phải được xác định trong spring-mvc-servlet.xml, vì vậy họ "nhìn thấy" những thứ Xuân An quy định tại applicationContext.xml


Tôi có cần phải di chuyển tôi từ tệp servlet.xml cho tệp globalContext.xml chung?

Không


Tôi có cần cấu hình thêm trong mùa xuân-MVC-servlet.xml nói với nó để tham gia vào an ninh mùa xuân?

Không


... mà lá mùa xuân-MVC-context.xml gần như trống rỗng. Điều này có phổ biến không?

spring-mvc-context.xml nên chứa mọi thứ liên quan đến Nội dung web (ngoại trừ secrutiy). Vì vậy, những phần chung của spring-mvc-context.xml là quét thành phần cho @Controller, một số đánh chặn (mvc:interceptors), mvc:resources, mvc:default-servlet-handler, mvc:view-controller, ReloadableResourceBundleMessageSource, CookieLocaleResolver, .SimpleMappingExceptionResolver ...

BTW: Nếu bạn sử dụng quét thành phần, sau đó bạn cần hai của họ, một tại số applicationContext.xml để quét cho @Service@Repository@Component (Nhưng không phải @Controller) và một giây trong spring-mvc-context.xml chỉ quét cho @Controller!


@See cũng câu hỏi này: ContextLoaderListener or not? Nó thảo luận về các chủ đề từ một quan điểm kia.

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