我是Spring Boot和Spring Security的新手,并且正在构建RESTful API服务,以允许用户在应用程序上注册,登录和执行其他操作。
我正在使用JWT进行索赔验证,每次用户使用登录和注册以外的API时,我都会传递令牌。因此,在不传递JWT的情况下,我将允许访问这些API,但是对于其余部分,如果未传递JWT,我想直接拒绝该请求。
我只有一个控制器,即UserController,它映射到路径/api/user
。它将为以下API服务-
/sign-up
。这是一个POST方法。我希望它允许访问它而无需传递JWT。
/verify/{verificationCode}
这是一个GET方法。我希望允许它访问它而无需传递JWT。
/set-password/
这是一个POST方法,将返回JWT。
/set-profile
。这是一种PUT方法,将使用JWT。
我尝试了一些使用antMatchers配置WebSecurity和HttpSecurity的示例,并且还配置了GenericFilterBean。
我不知道正确的方法和帮助将不胜感激。我正在使用Spring的2.1.3.RELEASE版本。
答案 0 :(得分:0)
您可以通过配置HttpSecurity
来配置每个URL的安全性:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//Ignore other configuration stuff for simplicity
http.authorizeRequests()
.antMatchers("/sign-up" ,"/verify/**" ).permitAll()
.anyRequest().authenticated()
}
}
然后,除了/sign-up
和/verify/**
之外,所有对URL的请求都需要身份验证(在您的情况下,这意味着JWT)。
如果您想进一步控制/sign-up
,并且/verify/**
仅在不使用正确的HTTP方法进行身份验证的情况下才能访问,甚至可以执行以下操作:
http.authorizeRequests()
.antMatchers(HttpMethod.POST, "/sign-up").permitAll()
.antMatchers(HttpMethod.GET, "/verify/**").permitAll()
.anyRequest().authenticated()
答案 1 :(得分:0)
您可以使用以下配置来满足您的要求。这是使用不需要在WebSecurity using ignoring instead of HttpSecurity as WebScurity will bypass the Spring Security Filter Chain and reduce the execution time
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/sign-up")
.antMatchers("/verify/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/set-password/").hasRole("yourROLE")
.antMatchers("/set-profile").hasRole("yourROLE")
.anyRequest().authenticated();
}
使用HttpSecurity
并尝试permitAll()
请求时。您的请求将被允许从Spring Security过滤链访问。这是昂贵的,因为还会有其他请求也要进入此过滤器链的请求,这些请求基于身份验证/授权需要被允许或不允许
但是,当您使用WebSecurity
时,对sign-up or verify
的任何请求都将完全通过Spring Security筛选器链。这是安全的,因为您无需进行任何身份验证/授权就可以查看图像或读取javascript文件。