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

时间:2018-09-24 12:32:55

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

我有一个具有安全性的Spring Boot应用程序。并且我已经删除了此“ / login” URL的身份验证。

我的安全配置

@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和异常返回值的rest控制器

@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未经授权。

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

1 个答案:

答案 0 :(得分:2)

我找到了答案,并想在相同情况下帮助其他人。

我的问题是,当返回带有错误代码404 NotFound的rest异常时,Spring Boot将自动重定向到url“ / error”。但是,此网址映射需要开放供业务使用。 因此,我也不得不忽略对该URL的授权。

这里的解决方案是添加以下内容:

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");
    }
}