• Spring: Как сделать аутентификацию на основе bearer токена?

    jaxtr
    @jaxtr
    JavaEE/Spring-разработчик
    1. Класс, реализующий Authentication.
      TokenAuthentication.java
      public class TokenAuthentication extends AbstractAuthenticationToken {
          private final Object principal;
          private final Object credentials;
          public TokenAuthentication(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
              super(authorities);
              this.principal = principal;
              this.credentials = credentials;
              this.setAuthenticated(true);
          }
          public TokenAuthentication(Object principal, Object credentials) {
              this(principal, credentials, null);
          }
          @Override
          public Object getPrincipal() {
              return principal;
          }
          @Override
          public Object getCredentials() {
              return credentials;
          }
      }

    2. Фильтр, с которого начнётся процесс аутентификации пользователя. Фильтр должен создать объект типа Authentication и попробовать аутентифицировать его при помощи AuthenticationManager.
      TokenHeaderAuthenticationFilter.java
      public class TokenHeaderAuthenticationFilter extends OncePerRequestFilter {
      
          private final AuthenticationManager authenticationManager;
      
          public TokenHeaderAuthenticationFilter(AuthenticationManager authenticationManager) {
              this.authenticationManager = authenticationManager;
          }
      
          @Override
          protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
              if (SecurityContextHolder.getContext().getAuthentication() != null && SecurityContextHolder.getContext().getAuthentication().isAuthenticated()) {
                  filterChain.doFilter(servletRequest, servletResponse);
                  return;
              }
              String headerValue = servletRequest.getHeader("X-Authorization");
              if (StringUtils.isEmpty(headerValue)) {
                  filterChain.doFilter(servletRequest, servletResponse);
                  return;
              }
              String token = headerValue.split("\\s")[1];// ну или headerValue.replace("Bearer ")
              TokenAuthentication authenticationToken = new TokenAuthentication(null, token);
              authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(servletRequest));
      
              Authentication authenticationResult = authenticationManager.authenticate(authenticationToken);
              SecurityContextHolder.getContext().setAuthentication(authenticationResult);
              filterChain.doFilter(servletRequest, servletResponse);
          }
      }

    3. Класс, реализующий AuthenticationProvider. Этот класс и будет производить аутентификацию полученных данных.
      TokenAuthenticationProvider.java
      public class TokenAuthenticationProvider implements AuthenticationProvider {
          @Override
          public boolean supports(Class<?> authentication) {
              return TokenAuthentication.class.isAssignableFrom(authentication);
          }
          @Override
          public Authentication authenticate(Authentication authentication) throws AuthenticationException {
              // здесь должна быть реализована логика аутентификации полученных данных
          }
      }

    4. Последний штрих - конфигурация.
      SecurityConfig.java
      @Configuration
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
      
          @Bean
          public AuthenticationProvider tokenAuthenticationProvider() {
              return new TokenAuthenticationProvider();
          }
      
          @Override
          protected void configure(HttpSecurity http) throws Exception {
              http.addFilterAfter(new TokenHeaderAuthenticationFilter(authenticationManagerBean()), BasicAuthenticationFilter.class)
                      .authenticationProvider(tokenAuthenticationProvider())
                      .authorizeRequests()
                      .anyRequest().authenticated();
          }
      }

    Ответ написан
    Комментировать
  • Как избежать заражения со стороннего сайта?

    VasyaPertrov
    @VasyaPertrov
    Изготовление и безопастность сайтов. WP и др.
    И заразиться вирусом можно только авто скачиванием файла с сайта?

    Можно заразиться и от ненадёжных женщин ;)
    Или ты про заражение своего компьютера на винде? А причем тогда тег "Веб-разработка", да единственный?

    Но если поставить в браузере о запросе скачки файла для выбора папки, это избавит от возможности словить вирус?

    На 100%, нет, но это хорошая мера безопасности.
    Ответ написан
    Комментировать
  • С чего начать карьеру, если чувствуешь свою проф непригодность, хотя никогда не пытался устроиться?

    platotel
    @platotel
    IT Product Manager
    selfdestroy, добрый день. Что мне бросилось в глаза:
    - ник про саморазрушение и отсутствие аватарки, что иногда (не всегда) бывает признаком низкой самооценки. Да, есть те, кто по идеологическим или ещё каким-то причинам не хочет афишировать своё лицо, у кого-то просто нет хорошей фотографии, кто-то больше любит какую-то картинку поставить вместо лица, но нет ли именно проблем с восприятием себя?
    - наложение на себя клейма: "проф непригодность", "не обладаю супер знаниями",
    - страх отказа ("никогда не пытался устроиться"),
    - позиция "снизу", демонстрация чувство вины ("извиняюсь"),
    - растерянность ("понятия не имею, как найти", "не знаю, куда плыть дальше"),
    - настрой на провал ("меня просто нигде не возьмут"),
    - "никогда не щупал продакшн в живую" - есть стажировки, Open Source проекты, онлайн-курсы, на которых можно делать свой проект, обучаясь.

    Если Вы сами не верите в себя, кто в Вас поверит? Пожалеют - да, кто-то добрый - даст совет, но сами подумайте: Вы бы взяли на работу человека, который бы на собеседовании говорил, что вообще-то, он плохо подготовлен для работы у Вас, который бы на вопросы о известных ему технологиях сказал бы что-то о том, что не пробовал их изучать, потому что они слишком сложны и т. п.

    Я Вас очень понимаю в том, что иногда хочется опустить руки и переложить ответственность за свою жизнь на кого-то другого или на сложные обстоятельства. Но Вы ведь понимаете, что сильнее Вас за Ваши мечты и идеалы не будет бороться никто? Только Вы можете сказать себе: "я - хозяин своей жизни, и всё, что со мной происходит - результат моих действий либо моего восприятия происходящего". Очень просто сказать: "полюби себя", "начни ценить себя", но часто за низкой самооценкой кроется именно нежелание брать на себя ответственность за свою жизнь. Попробуйте что-то делать в этом направлении. Тогда и в программировании, и в трудоустройстве, и в общении с окружающими станет проще.
    Ответ написан
    17 комментариев
  • Как отрезать устройство от доступа ко внутренней сети?

    @yaror
    10 лет в мобильном телекоме
    В дополнение к варианту Eugene Khrustalev:
    Предполагаю, что малина сидит не голым задом в интернете, а за каким-то маршрутизатором.

    В таком случае, разумнее всего было бы выселить её в так называемую демилитаризованную зону (DMZ):
    1. Поселить её в отдельный Ethernet-сегмент/VLAN
    2. В этом сегменте:
    2.1. Использовать отдельную серую ip-адресацию
    2.2. Настроить NAT: Destination NAT для входящих и Source NAT для исходящих соединений с малины
    2.3. Запретить любой доступ на сам маршрутизатор, разрешив только транзит трафика
    3. На маршрутизаторе явно разрешить только разрешённые типы трафика:
    3.1. Из внутренней сети в DMZ
    3.2. Из DMZ во внутреннюю сеть (не стоит, но вдруг зачем-то очень надо)
    3.3. Из DMZ в интернет
    3.4. Из интернета в DMZ

    Таким образом, даже при взломе сервера, получении рута и отключения iptables на малине злодей не сможет вылезти оттуда куда попало, поскольку трафик режется на условно неуязвимом для него маршрутизаторе.
    Ответ написан
    6 комментариев
  • Вторую неделю не запускается windows 10?

    Adamos
    @Adamos
    Нужно подождать еще две недели.
    Если в результате привыкание к Винде так и не пройдет - можно будет отчаяться и ввести в гугле "восстановление загрузчика Windows 10".
    Ответ написан
    2 комментария
  • Существует ли прилично прорисованное DE для Ubuntu?

    Adamos
    @Adamos
    '95 и Юнити? Хреново же вы ее вспоминаете...
    Мой Xfce с темой Clearlooks и то на Чикагу больше смахивает. Правда, мне-то это как раз не мешает.
    c52049ceb03c45cc8c26b5de99ba7901.png
    А вы бы уточнили - на которую именно Винду фапать изволите?
    На классически серую '98?
    Бездарно аляповатую Хрюшку?
    Бутылочно-стеклянную Висту?
    Парадно-витринную Семерку?
    Плоско-плиточную Восьмерку?
    Или, наконец, вершину эволюции - Десятку, где дизайнеры тупо не договорились?
    Ответ написан
    2 комментария
  • Существует ли прилично прорисованное DE для Ubuntu?

    UKUI, но я сам любитель Phanteon (Elementary OS)

    а вообще, посмотрите как над оболочками издеваются unixporn
    Ответ написан
    1 комментарий
  • Как организовать работу с гитом для нового проекта?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Используйте подход gitflow - https://habrahabr.ru/post/106912/
    Ответ написан
    Комментировать
  • Можно ли с помощью jaxb аннотаций обойти ошибку излишней вложенности с структуре xml?

    zolt85
    @zolt85
    Программист
    Можно сделать так, (даже нужно, наверное)
    @XmlElementWrapper(name = "linked_documents_items")
    @XmlElement(name = "linked_documents_item")
    private List<LinkedDocument> linkedDocuments;
    Ответ написан
    3 комментария
  • Какой инструмент типа MS Access можно использовать для ведения базы данных через веб-интерфейс?

    nki
    @nki
    Автоматизация бизнес-процессов.
    На 1С все это можно сделать без особых проблем.
    Ответ написан
    Комментировать