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 Actuator - 禁用安全性