Обработка ошибок авторизации, когда не работает служба авторизации в Spring boot security - PullRequest
0 голосов
/ 14 марта 2019

В моем весеннем загрузочном веб-приложении я подключился к сторонней службе авторизации, а мое приложение является просто поставщиком контента. Родительское приложение использует сайт миндер для аутентификации. Мое приложение получает идентификатор пользователя в заголовке и обращается к стороннему 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());  
               } 
      }

1 Ответ

0 голосов
/ 15 марта 2019

Реализуйте AuthenticationEntryPoint и переопределите метод commence() следующим образом.

public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(
            HttpServletRequest request, 
            HttpServletResponse response, 
            AuthenticationException authException) throws IOException, ServletException {

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");

    }

}

И после этого создайте в своем классе WebSecurityCustomConfig метод, который инициализирует класс RestAuthenticationEntryPoint следующим образом.

public AuthenticationEntryPoint authenticationEntryPoint() {
    RestAuthenticationEntryPoint ep = new RestAuthenticationEntryPoint();
    return ep;
}

Затем измените следующую строку на http.exceptionHandling().authenticationEntryPoint(customEntryPoint());
до
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...