在我们的Java应用程序中,我们使用Spring安全性来处理基于角色的授权。最近,我们意识到在web.xml
中对多个servlet映射做了很多这些URL检查很容易被绕过。但是,在将其缩减为一个servlet映射之后,我仍然不确定我们的URL匹配器设置正确,因为它们非常容易绕过。例如:
<sec:intercept-url pattern="/m/partner/list/**" access="hasRole('VIEW_ADMIN_PARTNER_LIST')"/>
乍一看,它确实会阻止具有VIEW_ADMIN_PARTNER_LIST
角色的用户加载该页面...直到我将.html
添加到其末尾。然后加载就好了。或者,如果我添加.fff
或任何其他扩展程序,它都可以。所以,我们将模式改为:
<sec:intercept-url pattern="/m/partner/list**" access="hasRole('VIEW_ADMIN_PARTNER_LIST')"/>
哪个效果很好!现在无论我添加到网址末尾的扩展名,我仍然会收到403错误。但是......在URL的末尾添加斜杠会完全绕过安全性。不是我们想要的。
因此,为了真正实现实际的URL模式安全性,我们必须实现这两种模式?这不太理想,因为我们有超过75个URL安全规则,并且重复它们并使它们保持同步将是困难的。是否有更好的方法来编写模式匹配,或者Spring的安全性本身是否已被破坏?
编辑:以下是我们的web.xml中的相关信息:
<servlet-mapping>
<servlet-name>myproject</servlet-name>
<url-pattern>/m/*</url-pattern>
</servlet-mapping>
<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>
答案 0 :(得分:0)
切换到使用正则表达式表达您的网址,它为您提供了更大的灵活性,例如:
<sec:http auto-config="true" use-expressions="true" path-type="regex">
<sec:intercept-url pattern="/m/partner/list.*" access="hasRole('VIEW_ADMIN_PARTNER_LIST')"/>
</sec:http>
注意/**
已替换为.*
,其在正则表达式世界中将匹配任何内容。
答案 1 :(得分:-1)
Spring安全性默认使用Ant模式。您正在寻找的模式是
/m/partner/list*/**
这将匹配
下面是一段Java代码,可用于测试Ant模式(将ant.jar添加到类路径中)
import org.apache.tools.ant.types.selectors.SelectorUtils;
public class PatternTest {
public static void main(String [] args) {
System.out.println(SelectorUtils.matchPath("/a/b*/**", "/a/b"));
System.out.println(SelectorUtils.matchPath("/a/b*/**", "/a/b.html"));
System.out.println(SelectorUtils.matchPath("/a/b*/**", "/a/b/c.html"));
}
}