Установить конечную точку отключения только перехватчика - PullRequest
0 голосов
/ 17 марта 2020

В Spring Boot версии 2.2 у меня есть реализация HandlerInterceptor, и я предоставляю информацию, состояние, конечные точки выключения привода.

Я бы хотел установить этот перехватчик только для конечной точки выключения, но не уверен, как это сделать.

Уже известно, что код на следующей странице полезен для установки перехватчика для всех конечных точек.

@Configuration
public class ActuatorConfig extends WebMvcEndpointManagementContextConfiguration {

  @Autowired
  private AuthenticationInterceptor authenticationInterceptor;

  public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebAnnotationEndpointDiscoverer endpointDiscoverer,
                                                                       EndpointMediaTypes endpointMediaTypes,
                                                                       CorsEndpointProperties corsProperties,
                                                                       WebEndpointProperties webEndpointProperties) {
    WebMvcEndpointHandlerMapping mapping = super.webEndpointServletHandlerMapping(
      endpointDiscoverer,
      endpointMediaTypes,
      corsProperties,
      webEndpointProperties);

    mapping.setInterceptors(authenticationInterceptor);

    return mapping;
  }
}

Также я проверил эту страницу

1 Ответ

0 голосов
/ 17 марта 2020

В комментариях весенней команды по проблеме github ссылка предлагается создать фильтр для перехвата конечной точки привода.

Вы можете создать фильтр сервлета и добавить логи аутентификации c.

Вот пример:

@Component
public class ActuatorFilter implements Filter {
    private final BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
    private String encryptedPassword;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        try {
            File file = ResourceUtils.getFile("classpath:password.txt");
            try (FileReader reader = new FileReader(file)) {
                char[] chars = new char[(int) file.length()];
                reader.read(chars);
                encryptedPassword = new String(chars);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        String url = request.getRequestURI().toString();
        String rawPassword = request.getHeader("Authorization");

        if(url.equals("/actuator/shutdown") && !passwordEncryptor.checkPassword(rawPassword,encryptedPassword)){
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            PrintWriter out = response.getWriter();
            out.print("Invalid password");
            out.flush();
            return;
        }
        chain.doFilter(req, res);
    }

    @Override
    public void destroy() { }
}

В приведенном выше коде я использовал jasypt для шифрования пароля и сопоставления его в фильтре.

Вы можете использовать new BasicPasswordEncryptor().encryptPassword(rawPassword); для получите зашифрованный пароль и сохраните его в БД или в файле. В приведенном выше коде я сохранил зашифрованный пароль в password.txt в папке resources

enter image description here

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