【问题标题】:Spring-Security: Difference Between /** and /* url pattern in Spring-SecuritySpring-Security:Spring-Security 中 /** 和 /* url 模式之间的区别
【发布时间】:2014-09-16 21:22:08
【问题描述】:
我对 Spring Security 中的 URL 模式有点困惑。因为,在 servlet 核心 http 安全中,/ 和 /* url 模式用于指定一个或多个目录。 / 用于一个目录,/* 用于多个目录。但是在spring-security中,还引入了/**,/**url-pattern在安全方面的主要用途是什么。
【问题讨论】:
标签:
java
security
spring-security
url-pattern
【解决方案1】:
/* 和 /** 之间的区别在于,第二个匹配整个目录树,包括子目录,而 /* 只匹配它指定的级别。
【解决方案2】:
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
.antMatchers(HttpMethod.GET, "/**").permitAll
.antMatchers(HttpMethod.POST, "/*").permitAll
// ...
}
在此配置中,将允许任何“Get”请求,例如:
所以,所有这些 url 都匹配带有模式“/**”的文本。
“帖子”的允许网址:
以上网址与“/*”匹配
【解决方案3】:
根据 Spring Security 文档,/** 的主要目的是捕获所有通配符:
实际上,我们建议您在服务层使用方法安全性,以控制对您的
应用程序,并且不完全依赖于使用在 Web 应用程序级别定义的安全约束。
URL 发生变化,很难考虑应用程序可能支持的所有可能的 URL,并且
如何操纵请求。您应该尝试限制自己使用一些简单的蚂蚁路径
很容易理解。始终尝试使用“默认拒绝”方法,其中您有一个通用通配符
(/** 或 **) 最后定义并拒绝访问。
我们也不应该忘记这一点
模式总是按照它们定义的顺序进行评估。因此,更具体的模式在列表中定义得比不太具体的模式更高,这一点很重要。
因此我们可以有这样的东西:
<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("AUTH_REPORT_EXPORTXML")
一般而言,据我了解,/* 和 /** 之间没有区别,只是最后一个捕获了所有通配符。