spring - 在其他模式之前定义了通用匹配模式('/**')

标签 spring spring-mvc spring-security

尝试将Spring Security引入我的Web应用程序时遇到问题。这是我的web.xml:

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:application-context.xml
        classpath:web-context.xml
        classpath:security-context.xml
    </param-value>
</context-param>

<context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
</context-param>

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

<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/admin</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

<session-config>
    <session-timeout>30</session-timeout>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

<!-- Spring Security config -->
<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>
security-context.xml:
<security:http auto-config='true'>
    <security:intercept-url pattern="/admin.html" />
    <security:http-basic />
</security:http>
<security:http pattern="/services/**" security="none" />
<security:authentication-manager>
    <security:authentication-provider>
        <security:user-service>
            <security:user name="admin" password="analyzer4321"
                authorities="ROLE_ADMIN" />
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>

当我尝试运行服务器时,在启动时出现以下异常:
java.lang.IllegalArgumentException: A universal match pattern ('/**')
is defined before other patterns in the filter chain, causing them to be ignored.
Please check the ordering in your <security:http> namespace or 
FilterChainProxy bean configuration.

我不知道我在做什么错。有什么建议么?

最佳答案

您的security-context.xml文件中的这一部分:

<security:http auto-config='true'>
    <security:intercept-url pattern="/admin.html" />
    <security:http-basic />
</security:http>

在此(第二个)命令之前(由于其顺序)被处理:
<security:http pattern="/services/**" security="none" />

第一部分说:限制对/admin.html的访问,并允许自由访问任何其他页面。

第二部分是没有用的。它说:允许访问所有与/services/**匹配的页面。但这已被第一部分所允许。

您可以删除第二部分,也可以将其放在第一部分之前。

有关使用多个<http>标记的更多详细信息,请参见Spring Security Reference

顺便说一句,<intercept-url>标记通常具有access属性。我不确定<intercept-url>是否可以不使用access来使用。有关详细信息,请参见here

关于spring - 在其他模式之前定义了通用匹配模式('/**'),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24812902/

相关文章:

java - 我如何连接两个用户,以便他们可以使用 J2EE 网络技术(JSP、Spring 等)共享公共(public)对象(游戏实例)?

ajax - 使用WebContentInterceptor为spring mvc 3的不同部分设置不缓存?

spring - 使用 Apache poi 将 csv 转换为 xls/xlsx?

spring-mvc - 使用 Spring Security 登录错误时如何获取用户?

java - Spring-如何使用PropertyPlaceholderConfigurer动态加载文件

JAVA - 自定义过滤器验证失败后如何重定向到登录页面?

java - Spring Boot 使用模板引擎的麻烦

spring-mvc - 在片段之间传递变量 Thymeleaf

spring-boot - 如何在@WebMvcTest 中模拟自定义 JWT 声明

java - 我是否需要检查 Spring 中每个 Controller 中的有效 session ?