Java 创建URI模式匹配器以允许/不允许解码JWT

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方法。我希望它允许访问它,而不需要通过

我不熟悉Spring引导和Spring安全,我正在构建一个RESTful API服务,允许用户注册、登录和在应用程序上执行其他操作

我正在使用JWT进行索赔验证,每次我的用户使用API而不是登录和注册时,我都会传递令牌。因此,我希望在不传入JWT的情况下允许访问这些API,但对于其余部分,如果JWT未通过,我希望彻底拒绝请求

我只有一个控制器,即UserController,它映射到路径
/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文件。

谢谢您的回答。我会试试这个,让你知道它是怎么回事。谢谢你陈肯。你的解决方案也很有效!谢谢你肯的回答。我会试试这个,让你知道它是怎么回事。谢谢你陈肯。你的解决方案也很有效!感谢帕特尔·罗米尔的帮助!这对我很有效!感谢帕特尔·罗米尔的帮助!这对我很有效!