我有一个具有安全性的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的授权中忽略异常处理?
答案 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");
}
}