如何在未经身份验证的情况下允许Spring安全中的某些端点?

时间:2018-10-10 16:07:08

标签: spring-boot spring-security

我有一个Spring Boot Rest API Web应用程序,在其中我正在使用Spring Security来使大多数端点需要身份验证。 这是代码的一部分:

public class SecurityConfig extends WebSecurityConfigurerAdapter {
....
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .requestMatchers()
                .antMatchers("/oauth/token")
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS).permitAll()
                .anyRequest().authenticated();
    }

有人可以解释以http.csrf开头的每一行的含义吗?

我该如何修改上面的代码,以便无需进行身份验证就可以访问/ bars / pk,就像没有Spring Security一样?

2 个答案:

答案 0 :(得分:1)

默认情况下,Spring Boot会激活针对CSRF attack(跨站点请求伪造攻击)的保护。攻击由恶意站点组成,该站点利用对用户进行了身份验证的恶意站点(例如银行),诱骗用户对该站点执行操作(例如资金转账)。

防范攻击的措施包括Spring Boot应用程序在每个响应中发送一个令牌,并期望该令牌将由客户端在后续请求中发送。如果未收到令牌,Spring Boot将返回错误。

有时,您想禁用此行为(后果自负),因此请使用csrf.disable。如果开发无状态API,可能会很方便地禁用csrf保护,并且无法将POST请求链接到任何先前的请求或会话。但同样,您需要仔细考虑并对此进行推理。

请注意,CSRF保护对GET请求无效。它只会影响状态更改请求(例如POST,DELETE)

为了在不需要任何身份验证的情况下将您的内含物带给任何人,您需要使用

  

http.authorizeRequests()。antMatchers(“ / **”)。permitAll();

编辑

要专门允许未经授权的请求/bars/pk并保持其他元素不变,请按如下所示修改代码:

http.csrf().disable()
                .requestMatchers()
                .antMatchers("/oauth/token")
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS).permitAll()
                .antMatchers("/bars/pk").permitAll()
                .anyRequest().authenticated();

答案 1 :(得分:1)

这是一个完整的示例:

 httpSecurity.authorizeRequests()
                    .antMatchers(HttpMethod.GET)                  
                    .permitAll() // Allow all GET requests to go unauthenticated
                    .antMatchers(allowedResources)                  
                    .permitAll() // Allow all requests to go unauthenticated for the specified paths
                    .antMatchers(protectedResources).hasRole(USER)
                    .antMatchers(adminResources).hasRole(ADMIN)
                    .anyRequest().authenticated(); // Authenticate all other request paths