Spring 引导请求映射 URL 不在资源服务器配置类中时不受保护



我从以下文件开始,使用 Spring 安全性和 OAuth2 配置 URL 和受保护的路径:

@EnableResourceServer
@RestController
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter
{
      @RequestMapping("/publica")
      public String publico() {
        return "Pagina Publica";
      }
      @RequestMapping("/privada")
      public String privada() {
        return "Pagina Privada";
      }
      @RequestMapping("/admin")
      public String admin() {
        return "Pagina Administrador";
      }
      @Override
        public void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests().antMatchers("/oauth/token", "/oauth/authorize**", "/publica").permitAll();
            http
                .requestMatchers().antMatchers("/privada")
                .and().authorizeRequests()
                .antMatchers("/privada").access("hasRole('USER')")
                .and().requestMatchers().antMatchers("/admin")
                .and().authorizeRequests()
                .antMatchers("/admin").access("hasRole('ADMIN')");
        }   
}

这工作正常。如果我尝试在邮递员中访问/privada它会返回 401。

但是,对于我计划从中构建的应用程序,我认为最好在自己的控制器中组织URL(例如FundsController,UsersController,ProductsController等(

因此,作为上面的一个基本示例,我将路径映射方法移到 BasicController 中:

@RestController
public class BasicController
{
    @RequestMapping("/publica")
    public String publico() {
        return "Pagina Publica";
    }
    @RequestMapping("/privada")
    public String privada() {
        return "Pagina Privada";
    }
    @RequestMapping("/admin")
    public String admin() {
        return "Pagina Administrador";
    }
}

但是将安全内容保留在资源服务器配置中:

@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter
{
      @Override
        public void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests().antMatchers("/oauth/token", "/oauth/authorize**", "/publica").permitAll();
            http
                .requestMatchers().antMatchers("/privada")
                .and().authorizeRequests()
                .antMatchers("/privada").access("hasRole('USER')")
                .and().requestMatchers().antMatchers("/admin")
                .and().authorizeRequests()
                .antMatchers("/admin").access("hasRole('ADMIN')");
        }   
}

但是现在当我重新启动应用程序(内存中访问令牌已销毁(然后转到/privada它返回Pagina Privada我认为是西班牙语的"私人页面":)无论如何都不需要访问令牌,这不是我想要的。当它都在同一类中时,它应该像以前一样返回 401。我哪里做错了?

添加

@Configuration
@EnableWebSecurity

对资源服务器配置类的注释和 扩展WebSecurityConfigurerAdapter而不是ResourceServerConfigurerAdapter

您需要在覆盖的配置方法中具有以下内容

.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/context"))
.antMatchers("/context/**").fullyAuthenticated();

最新更新