Spring Security 使用 HttpSecurity 对 url 和方法的请求进行授权

Posted

技术标签:

【中文标题】Spring Security 使用 HttpSecurity 对 url 和方法的请求进行授权【英文标题】:Spring security authorize request for url & method using HttpSecurity 【发布时间】:2015-05-08 13:04:21 【问题描述】:

有没有办法使用 org.springframework.security.config.annotation.web.builders.HttpSecurity 授权对特定 url 的发布请求?

我正在使用HttpSecurityas:

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .addFilterAfter(new CsrfCookieGeneratorFilter(), CsrfFilter.class)
            .exceptionHandling()
            .authenticationEntryPoint(authenticationEntryPoint)
        .and()
            .rememberMe()
            .rememberMeServices(rememberMeServices)
            .key(env.getProperty("jhipster.security.rememberme.key"))
        .and()
            .formLogin()
            .loginProcessingUrl("/api/authentication")
            .successHandler(ajaxAuthenticationSuccessHandler)
            .failureHandler(ajaxAuthenticationFailureHandler)
            .usernameParameter("j_username")
            .passwordParameter("j_password")
            .permitAll()
        .and()
            .logout()
            .logoutUrl("/api/logout")
            .logoutSuccessHandler(ajaxLogoutSuccessHandler)
            .deleteCookies("JSESSIONID")
            .permitAll()
        .and()
            .headers()
            .frameOptions()
            .disable()
            .authorizeRequests()
                .antMatchers("/api/register").permitAll()
                .antMatchers("/api/activate").permitAll()
                .antMatchers("/api/authenticate").permitAll()
                .antMatchers("/api/logs/**").hasAuthority(AuthoritiesConstants.ADMIN)
                .antMatchers("/api/subscriptions").permitAll()
                .antMatchers("/api/**").authenticated();

我想允许对 /api/subscription 路径的 POST 请求。仅发布。 谢谢。

【问题讨论】:

【参考方案1】:

看看这里有https://github.com/spring-projects/spring-data-examples/tree/master/rest/security

http
  .httpBasic().and()
  .authorizeRequests()
    .antMatchers(HttpMethod.POST, "/employees").hasRole("ADMIN")
    .antMatchers(HttpMethod.PUT, "/employees/**").hasRole("ADMIN")
    .antMatchers(HttpMethod.PATCH, "/employees/**").hasRole("ADMIN");

【讨论】:

已更新以排除从引用代码中复制的 csrf 禁用。这也在另一个答案中讨论过 为什么要排除?【参考方案2】:

我知道这个问题有点老了,但我不认为禁用 csrf 支持是一个可以接受的答案。我遇到了同样的问题,但使用 csrf.disable() 感觉不太好。相反,我在表单标签内的页面底部添加了以下行。

<input type="hidden" name="$_csrf.parameterName" value="$_csrf.token" />

【讨论】:

好点,我会更新我的答案,因为 csrf 部分与原始问题无关。这是从进行休息呼叫而不是网络的记录示例中获取的,如此处所示github.com/spring-projects/spring-data-examples/blob/master/…【参考方案3】:

只需提及您需要像这样删除身份验证的路径

    http
       .httpBasic().and()
       .authorizeRequests()
       .antMatchers("/employees" , "/employees/**")
       .permitAll().anyRequest().authenticated()
       .and().csrf().disable()

【讨论】:

不满足只允许 POST 请求的要求。

以上是关于Spring Security 使用 HttpSecurity 对 url 和方法的请求进行授权的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 Spring-Security(或)Spring 进行授权

在使用 Oauth、SAML 和 spring-security 的多租户的情况下从 spring-security.xml 中获取错误

Spring security:Spring security 如何在 SessionRegistry 中注册新会话?

未调用 Spring Security j_spring_security_check

使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis

如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config