Java 创建URI模式匹配器以允许/不允许解码JWT
我不熟悉Spring引导和Spring安全,我正在构建一个RESTful API服务,允许用户注册、登录和在应用程序上执行其他操作 我正在使用JWT进行索赔验证,每次我的用户使用API而不是登录和注册时,我都会传递令牌。因此,我希望在不传入JWT的情况下允许访问这些API,但对于其余部分,如果JWT未通过,我希望彻底拒绝请求 我只有一个控制器,即UserController,它映射到路径Java 创建URI模式匹配器以允许/不允许解码JWT,java,spring-boot,spring-security,Java,Spring Boot,Spring Security,我不熟悉Spring引导和Spring安全,我正在构建一个RESTful API服务,允许用户注册、登录和在应用程序上执行其他操作 我正在使用JWT进行索赔验证,每次我的用户使用API而不是登录和注册时,我都会传递令牌。因此,我希望在不传入JWT的情况下允许访问这些API,但对于其余部分,如果JWT未通过,我希望彻底拒绝请求 我只有一个控制器,即UserController,它映射到路径/api/user。它将为以下API提供服务- /注册。这是一种POST方法。我希望它允许访问它,而不需要通过
/api/user
。它将为以下API提供服务-
/注册
。这是一种POST方法。我希望它允许访问它,而不需要通过JWT
/verify/{verificationCode}
这是一个GET方法。我希望允许它访问它,而不需要通过JWT
/set password/
这是一个POST方法,将返回JWT
/set profile
。这是一种PUT方法,将使用JWT
我尝试了一些使用antMatchers配置WebSecurity和HttpSecurity的示例,还配置了一个GenericFilterBean
我不知道正确的方法和帮助将非常感谢。我使用的是Spring的2.1.3.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()
您可以通过配置
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()
您可以通过以下配置实现您的需求。这是一种很好的方法,可以使用不需要身份验证/授权的URL,将其放在
WebSecurity中,使用忽略而不是HttpSecurity,因为WebSecurity将绕过Spring安全过滤器链,并减少执行时间
@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安全过滤器链访问。这是代价高昂的,因为会有其他请求也会进入此筛选链,需要根据身份验证/授权允许或不允许这些请求
但是当您使用
WebSecurity
时,任何注册或验证的请求都将一起通过Spring安全过滤器链。它是安全的,因为您不需要任何身份验证/授权就可以查看图像或读取javascript文件。您可以通过以下配置实现您的要求。这是一种很好的方法,可以使用不需要身份验证/授权的URL,将其放在WebSecurity中,使用忽略而不是HttpSecurity,因为WebSecurity将绕过Spring安全过滤器链,并减少执行时间
@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安全过滤器链访问。这是代价高昂的,因为会有其他请求也会进入此筛选链,需要根据身份验证/授权允许或不允许这些请求
但是当您使用WebSecurity
时,任何注册或验证的请求都将一起通过Spring安全过滤器链。它是安全的,因为您不需要任何身份验证/授权就可以查看图像或读取javascript文件。谢谢您的回答。我会试试这个,让你知道它是怎么回事。谢谢你陈肯。你的解决方案也很有效!谢谢你肯的回答。我会试试这个,让你知道它是怎么回事。谢谢你陈肯。你的解决方案也很有效!感谢帕特尔·罗米尔的帮助!这对我很有效!感谢帕特尔·罗米尔的帮助!这对我很有效!