gpt4 book ai didi

java - Spring Security、尾部斜杠和 URL 中的点

转载 作者:IT老高 更新时间:2023-10-28 13:52:50 28 4
gpt4 key购买 nike

我使用 Spring Security 3.1.4 来保护部署到 Tomcat 的 Spring MVC 3.2.4 应用程序。我有以下 Spring Security 配置:

<http auto-config="true" use-expressions="true">
<http-basic />
<logout ... />
<form-login ... />

<intercept-url pattern="/" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/login" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/under-construction" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/admin-task*" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMINISTRATOR')" />
<intercept-url pattern="/resources/**" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>

我注意到不带斜杠的 URL 模式(例如,/about)与带有斜杠的 URL(例如,/about/)不匹配,反之亦然反之亦然。换句话说,带有斜线的 URL 和不带斜线的相同 URL 被 Spring Security 视为两个不同的 URL。该问题可以通过使用两个安全规则来解决:

<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about/" access="isAnonymous() or hasRole('ROLE_USER')" />

有没有更好的解决方案?

我知道 path-type="regex" 允许使用正则表达式定义 URL 模式,但如果可能的话,我想避免任何不必要的复杂性。

更新

正如 Adam Gent 所指出的,还有一个涉及带有点的 URL 的额外问题:Spring MVC 将 /about.foo/about 视为相同的 URL .但是,Spring Security 将它们视为两个不同的 URL。因此,可能还需要一条安全规则:

<intercept-url pattern="/about.*" .../>

最佳答案

Spring 安全 4.1+

Spring Security 现在添加了一个新的匹配器,它知道你的 Spring MVC URL 匹配配置。这告诉 Spring Security 根据 Spring MVC 使用的相同规则匹配路径,从而消除 URL 有效但不安全的可能性。

首先,您需要用新的 MVC 匹配器替换任何旧的匹配器。 Spring Security 现在与您已配置 Spring MVC 同步,因此您可以自由添加或删除任何路径匹配配置。我建议尽可能使用默认值。

Java 配置

如果您使用的是 antMatchers,您现在应该使用 mvcMatchers:

protected configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.mvcMatchers("/about").hasRole("USER");
}

XML 配置

您需要将属性 request-matcher 添加到您的 http 标签:

<http request-matcher="mvc">
<intercept-url pattern="/about" access="hasRole('USER')"/>
</http>

Full Reference

请注意,您也不应该再为您的角色添加前缀“ROLE_”,因为 Spring Security 会自动为您执行此操作。


Spring Security 4.1 之前的版本

我无法找到一种方法来处理 Spring Security 中的斜杠和路径后缀。显然可以编写一个正则表达式来处理这些情况,但这似乎使安全规则过于复杂并且容易出错。我希望尽可能自信地不会意外暴露资源。

因此,我的方法是在 Spring 中通过将路径匹配器配置为对尾部斜杠和后缀都严格来禁用此行为。

Java 配置

@Configuration
public class ServletConfig extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(final PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
configurer.setUseTrailingSlashMatch(false);
}
}

XML 配置

<mvc:annotation-driven>
<mvc:path-matching suffix-pattern="false" trailing-slash="false" />
</mvc:annotation-driven>

关于java - Spring Security、尾部斜杠和 URL 中的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590794/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com