使用Spring Security,我如何使用HTTP方法(例如GET,PUT,POST)来区分特定URL模式的安全性?

时间:2011-09-08 11:15:10

标签: java spring spring-security http-method

Spring Security参考说明:

  

您可以使用多个元素来定义不同的元素   访问不同URL集的要求,但它们将是   按列出的顺序评估,将使用第一个匹配。那么你   必须将最具体的匹配放在顶部。你也可以添加一个   method属性将匹配限制为特定的HTTP方法(GET,   POST,PUT等)。如果请求匹配多个模式,则   无论排序如何,特定于方法的匹配都将优先。

如何配置Spring Security,以便根据用于访问URL模式的HTTP方法,以不同方式保护对特定URL模式的访问?

2 个答案:

答案 0 :(得分:26)

这只是关于配置。它表示<intercept-url>元素将在配置文件的<http />标记中从上到下进行评估:

<http auto-config="true">
    <intercept-url pattern="/**" access="isAuthenticated" />
    <intercept-url pattern="/login.jsp" access="permitAll" />
</http>

在上面的示例中,我们尝试仅允许经过身份验证的用户访问所有内容,当然,登录页面除外(用户必须先登录,对吗?!)。但是根据文档,将不起作用,因为不太具体的匹配在顶部。因此,(一个)完成此示例目标的正确配置是:

<http auto-config="true">
    <intercept-url pattern="/login.jsp" access="permitAll" />
    <intercept-url pattern="/**" access="isAuthenticated" />
</http>

将更具体的匹配放在最上面。

引用说的最后一件事是关于HTTP方法。您可以使用它来指定匹配,所以:

<http auto-config="true">
    <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
    <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>

在第二个示例中,要通过GET访问/client/edit,用户只需要进行身份验证,但要通过POST访问/client/edit(比如说​​,提交编辑表单),用户需要拥有EDITOR角色。在某些地方可能不鼓励这种网址模式,但这只是一个例子。

答案 1 :(得分:12)

对于那些喜欢基于Java注释的配置的人,请将此类放入您的应用程序中。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers(HttpMethod.GET).permitAll();
        http.authorizeRequests().antMatchers(HttpMethod.POST).denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.DELETE,"/you/can/alsoSpecifyAPath").denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.PATCH,"/path/is/Case/Insensitive").denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.PUT,"/and/can/haveWildcards/*").denyAll();

    }

}

使用以下Maven依赖项(Spring-Security的早期版本也可以使用):

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>5.0.0.M3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>5.0.0.M3</version>
    </dependency>