我有一个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一样?
答案 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