我对Spring安全性中的URL模式有点混淆。因为,在servlet核心http安全性中,/
和/*
url模式用于指定一个或多个目录。 /
用于一个目录,/*
用于许多目录。但是在spring-security中,/**
也是介绍,/**
url-pattern在安全性方面的主要目的是什么。
答案 0 :(得分:18)
/ *&之间的区别/ **是第二个匹配整个目录树,包括子目录,其中/ *仅匹配指定的级别。
答案 1 :(得分:6)
根据Spring Security文档,/**
的主要目的是捕获所有通配符:
在实践中,我们建议您在服务层使用方法安全性来控制对您的访问权限 应用程序,并不完全依赖于在Web应用程序级别定义的安全性约束的使用。 网址发生变化,很难考虑应用程序可能支持的所有可能的网址 如何操纵请求。你应该试着限制自己使用一些简单的蚂蚁路径 很容易理解。总是尝试使用“默认拒绝”方法,您可以使用全能通配符 (/ **或**)最后定义并拒绝访问。
我们也不应该忘记
模式总是按照定义的顺序进行评估。因此,重要的是在列表中定义的更具体的模式比不太具体的模式更高。
因此我们可以这样:
<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")
总的来说,据我所知,/*
和/**
之间没有区别,只有最后一个会捕获所有通配符。
答案 2 :(得分:5)
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
.antMatchers(HttpMethod.GET, "/**").permitAll
.antMatchers(HttpMethod.POST, "/*").permitAll
// ...
}
在此配置中,任何&#34; 获取&#34;请求将被允许,例如:
因此,所有这些网址都匹配带有模式&#34; / **&#34;。
的文字&#34; 发布&#34;
的允许网址以上网址与&#34; / *&#34;
匹配