2012-08-25 21 views
41

Tôi đang học bảo mật mùa xuân từ tài liệu tham chiếu. phát hành 3.1.2.RELEASE. Như đã trình bày trong đó tôi đã cấu hình security:http thẻ như thế nàynhận ngoại lệ: Không có bean có tên 'springSecurityFilterChain' được định nghĩa

an ninh-context.xml

<security:http auto-config="true"> 
     <security:intercept-url pattern="/**" access="ROLE_USER"/> 
    </security:http> 

web.xml

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:*-context.xml</param-value> 
    </context-param> 

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

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
    <servlet-name>security</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>security</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 

an ninh-servlet.xml

<context:component-scan base-package="com.pokuri.security.mvc.controllers"/> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/WEB-INF/page/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

Nhưng tôi nhận được ngoại lệ này khi tôi khởi động ứng dụng. Nếu tôi xóa cấu hình bảo mật, ứng dụng web mùa xuân của tôi hoạt động tốt. Tôi đã đi qua cùng một loại câu hỏi trong stackoverflow. Nhưng không may mắn.

+0

Thêm nó vào 'ngữ cảnh ứng dụng gốc' hoặc' bối cảnh ứng dụng DispatcherServlet'. Bạn có thể làm điều đó một cách dễ dàng bằng cách mở rộng 'AbstractAnnotationConfigDispatcherServletInitializer'. – smwikipedia

Trả lời

62

Tôi nghĩ rằng lý do của sự cố của bạn có thể là tệp cấu hình xml của bạn cho bảo mật mùa xuân không được tải khi bạn khởi động ứng dụng web của mình.

Để khắc phục điều này, bạn nên xác định tất cả các file cấu hình XML của bạn trong web.xml như thế:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring-security.xml, /WEB-INF/applicationContext.xml</param-value> 
</context-param> 

Nếu bạn có tập tin cấu hình của bạn trong classpath (không thư mục WEB-INF hoặc đó là thư mục con) sau đó bạn có thể chỉ định danh sách các tệp cấu hình theo cách như vậy;

... 
<param-value> 
    classpath:applicationContext.xml, 
    classpath:spitter-security.xml 
</param-value> 
... 

Và bạn cũng cần thêm người nghe đặc biệt mà sẽ được tải tập tin cấu hình của bạn:

<listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 
+1

nhưng tôi có cấu hình tham số ngữ cảnh và người nghe trong web.xml – Pokuri

+0

vâng đây là vấn đề với tham số ngữ cảnh của tôi. Tôi đã đưa ra giá trị tham số như classpath *: * - context.xml mà không phải là cách đúng để nhận security-context.xml. Vì vậy, thay đổi ký tự đại diện thành classpath: **/* - context.xml. Bây giờ mọi thứ hoạt động tốt – Pokuri

+2

Lưu ý: Tôi phải thêm nó vào ngữ cảnh ứng dụng gốc (không phải ngữ cảnh servlet ứng dụng). –

3

thêm web.xml của bạn này

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/root-context.xml, /WEB-INF/spring-security.xml</param-value> 
</context-param> 

<!-- Creates the Spring Container shared by all Servlets and Filters --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

     <!-- filter declaration for Spring Security --> 
<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> 
10

Tôi chỉ cần thêm định nghĩa bean trong applicationContext .xml as Spring đã yêu cầu:

<bean id="springSecurityFilterChain" class="org.springframework.web.filter.DelegatingFilterProxy"/> 
Các vấn đề liên quan