Spring-Security:/**和/* URL模式的区别

36

我对Spring Security中的URL-pattern有些困惑。因为在Servlet Core HTTP Security中,//* URL模式用于指定一个或多个目录。其中/用于一个目录,而/*用于多个目录。但是,在Spring Security中,还引入了/**,那么/** URL-pattern在安全性方面的主要目的是什么。

4个回答

34

/* 和 /** 的区别在于后者匹配整个目录树,包括子目录,而 /* 只匹配指定层级。


16
 @Override
    protected void configure(HttpSecurity http) throws Exception {
    // ...
    .antMatchers(HttpMethod.GET, "/**").permitAll
    .antMatchers(HttpMethod.POST, "/*").permitAll
    // ...
 }
在这个配置中,任何 "Get" 请求都将被允许,例如:
  • /book
  • /book/20
  • /book/20/author
因此,所有这些 URL 都与模式 "/**" 匹配。
"Post" 的允许 URL 如下:
  • /book
  • /magazine
上述 URL 与 "/*" 匹配。

8
根据Spring Security文档,/**的主要目的是捕获所有通配符:
实际上,我们建议您在服务层使用方法安全性来控制对应用程序的访问,并不完全依赖于在Web应用程序级别定义的安全性约束。URL会发生变化,很难考虑应用程序可能支持的所有可能的URL以及请求可能被操纵的方式。您应该尝试限制自己使用一些简单易懂的ant路径。始终尝试使用“默认拒绝”的方法,在最后定义一个捕获所有通配符(/**或**)并拒绝访问。
我们也不应忘记:
模式总是按照它们定义的顺序进行评估。因此,更具体的模式比不太具体的模式在列表中定义得更高是很重要的。
因此,我们可以像这样:
<security:http pattern="/rest-service/**"  authentication-manager-ref="authenticationManager" auto-config="false" access-decision-manager-ref="accessDecisionManager">
    <security:intercept-url pattern="/rest-service/report/export/xml" access="AUTH_REPORT_EXPORTXML" />        
    <security:intercept-url pattern="/**" access="AUTH_SYSTEM_LOGIN" />
    <security:http-basic />
</security:http>

这意味着对于所有请求,我们都需要具有AUTH_SYSTEM_LOGIN权限,但是特别是对于/rest-service/report/export/xml,用户还需要具有AUTH_REPORT_EXPORTXML权限,因为它在上面被定义了。正如他们所说的那样,仅依赖于此安全约束并不好,这意味着最好还要在服务方法中使用secured注释来复制这些权限。
@Secured("AUTH_REPORT_EXPORTXML")

一般来说,据我所知,在/*/**之间没有区别,除了后者可以捕获所有通配符。

2

"/api/v1/user/*" - 将匹配任何值,直到另一个“/”

"/api/v1/user/**" - 将匹配以字符串开头的所有值(包括如果找到另一个“/”)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接