В моем весеннем загрузочном веб-приложении я подключился к сторонней службе авторизации, а мое приложение является просто поставщиком контента. Родительское приложение использует сайт миндер для аутентификации. Мое приложение получает идентификатор пользователя в заголовке и обращается к стороннему API, чтобы установить UserDetails с полномочиями.
Мое требование - обработать сценарий, когда сторонний сервис для авторизации не работает. В настоящее время в этом случае я устанавливаю UserDetails без ролей, и поскольку каждая конечная точка связана авторизацией, поэтому я получаю 403, если сторонний сервис для авторизации не работает.
Но я хочу отобразить другое сообщение, если у пользователя нет авторизации и если служба авторизации не работает.
Если я обработаю службу авторизации, выбрасывая пользовательское исключение из UserDetailsServiceImpl -> loadUserByUserName () , тогда RequestHeaderAuthenticationFilter встречает это исключение и запрос отфильтровывается. Есть идеи, как это сделать?
SecurityConfiguration
public class WebSecurityCustomConfig extends WebSecurityConfigAdapter {
private UserDetailsService userDetails;
protected void configure(HttpSecurity http) {
http.csrf().disable().authorizeRequests().antMatchers("/*).permitAll()
.anyRequests()
.hasAnyAuthority("MODULEX","MODULEY");
http.addFilterBefore(requestHeaderAuthFilter(),
BasicAuthenticationFilter.class);
http.exceptionHandling().authenticationEntryPoint(customEntryPoint());
}
protect void configure(AuthenticationManagerBuilder builder) {
PreAuthenticaticatedAuthenticationProvider auth = new
PreAuthenticaticatedAuthenticationProvider ();
auth.setPreAuthenticatedUserDetailsService(new
UserDetailsByNameServiceWrapper<>(userDetails));
}
}
CustomDetailsService
public class CustomUserDetailsService implements UserDetailsService {
private final AuthorizationService authService;
@Inject
public CustoUserDetailsService(AuthorizationService authService) {
this.authService = authService;
}
public UserDetails loadUserByUsername(String username) {
return new User(username, "",
authService.getAuthorities(username));
// authService is a third party jar and if their upstream service
//is down , it throws a runtime exception
}
}
Если я обработаю их ошибку следующим образом, то получу 403, но мне нужно 503 в случае, если сервис не работает, и 403, если у пользователя нет прав доступа к конечной точке, к которой он обращается.
текущее исключение службы аутентификации обработки
public UserDetails loadUserByUsername(String username) {
try{
return new User(username, "",
authService.getAuthorities(username));
}
catch(AuthServiceException e) {
return new User(username, "",
Collections.emptyList());
}
}