Spring Boot:禁用状态异常代码的安全性

Posted

技术标签:

【中文标题】Spring Boot:禁用状态异常代码的安全性【英文标题】:Spring Boot: disable security for status exception code 【发布时间】:2019-02-27 23:26:05 【问题描述】:

我有一个 Spring Boot 应用程序,具有安全性。我已经删除了这个“/login”网址的身份验证。

我的安全配置

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    private final JwtFilter jwtFilter;

    @Autowired
    public SecurityConfiguration(JwtFilter jwtFilter) 
        this.jwtFilter = jwtFilter;
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable()
                .anonymous().and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated().and()
                .apply(new JwtConfigurerAdapter(jwtFilter)).and()
                .exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
    

    @Override
    public void configure(WebSecurity web) throws Exception 
        web.ignoring().antMatchers("/v2/api-docs");
        web.ignoring().antMatchers("/login");
    

我的 NotFound 异常

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class NotFound extends RuntimeException 
    public NotFound(String message) 
        super(message);
    

我的带有登录 url 和异常返回值的休息控制器

@RestController
public class LoginController implements LoginService 
    @Override
    @GetMapping(value = "/login", produces = MediaType.APPLICATION_JSON_VALUE)
    public UserInfo loginUsingJson(String username, String password) 
        return findUser(username, password)).orElseThrow(() -> new NotFound("There does not exist any user by those credentials"));
    

好的,这是我的问题。当我在“/login”上调用 GET 并且 UserInfo 存在时,它将以 JSON 形式返回用户。这是因为web.ignoring().antMatchers("/login"); 起作用,但如果用户确实 存在,那么带有http 错误代码404 的异常NotFound 将不会显示。它现在返回错误代码 401 Not Authorized。

我猜它与 HttpSecurity 有关系,我必须在其中添加一些异常或其他东西,以便可以返回异常代码。 但是在HttpSecurity的授权中,我在哪里允许忽略异常处理呢?

【问题讨论】:

【参考方案1】:

我找到了答案,并希望帮助处于相同情况的其他人。

我的问题是,当返回带有错误代码 404 NotFound 的 rest 异常时,Spring Boot 会自动重定向到 url“/error”。但是这个url map需要开通业务。 所以我也不得不忽略这个网址的授权。

这里的解决方案是添加这个:

web.ignoring().antMatchers("/error");

这是更改后的类:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    private final JwtFilter jwtFilter;

    @Autowired
    public SecurityConfiguration(JwtFilter jwtFilter) 
        this.jwtFilter = jwtFilter;
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable()
                .anonymous().and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated().and()
                .apply(new JwtConfigurerAdapter(jwtFilter)).and()
                .exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED));
    

    @Override
    public void configure(WebSecurity web) throws Exception 
        web.ignoring().antMatchers("/v2/api-docs");
        web.ignoring().antMatchers("/login");
        web.ignoring().antMatchers("/error");
    

【讨论】:

以上是关于Spring Boot:禁用状态异常代码的安全性的主要内容,如果未能解决你的问题,请参考以下文章

完全禁用 Spring Boot 异常处理?

Spring boot 和 Spring Actuator - 禁用安全性

如何在 Spring-Boot 2 中禁用安全性? [复制]

Spring Boot:禁用安全自动配置

Spring Boot Security 禁用安全性

Spring Boot 异常自定义处理 - 意外的 HTTP 状态