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



我有一个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");
}
}

我的未找到异常

@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 并且用户信息存在时,它会将用户作为 JSON 返回。这是有效的,因为web.ignoring().antMatchers("/login");,但如果用户不存在,则不会显示带有 http 错误代码 404 的异常 NotFound。它现在返回错误代码 401 未授权。

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

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

我的问题是,当返回错误代码为 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");
}
}

相关内容

最新更新