【问题标题】:Spring Boot: disable security for status exception codeSpring Boot:禁用状态异常代码的安全性
【发布时间】: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的授权中,我在哪里允许忽略异常处理呢?

【问题讨论】:

    标签: java spring-boot spring-security exception-handling spring-security-rest


    【解决方案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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2020-06-11
      • 2016-05-03
      • 2016-01-02
      • 2019-12-28
      • 2020-03-07
      • 2018-04-26
      相关资源
      最近更新 更多