Как заблокировать IP-адрес с помощью Seam и JBoss AS?

по соображениям безопасности мы хотим блокировать пользователей по IP-адресу в нашем приложении, если они пытаются войти в систему как администратор и вводят неправильный пароль 3 раза.

Очень легко получить IP-адрес пользователя, пытающегося войти в систему. Я использую этот фрагмент кода для получения IP:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest)context.getRequest();
String ip = request.getRemoteAddr();

Мы используем JBoss 5.1.0 GA и Seam 2.2.1.CR2. Насколько мне известно, в Seam нет возможности заблокировать IP-адреса. Но можно ли вызывать функции JBoss для блокировки определенного IP?

Пожалуйста, дайте мне знать, есть ли у Seam какая-то поддержка для этого :)


person Dominik Obermaier    schedule 16.09.2010    source источник


Ответы (3)


Это должно быть очень легко сделать.

Предполагая, что у вас есть набор приложений со всеми IP-адресами, которые вы хотите заблокировать, вы можете использовать этот фильтр:

@Startup
@Scope(ScopeType.APPLICATION)
@Name("ipFilter")
@BypassInterceptors
@Filter(around ="org.jboss.seam.web.ajax4jsfFilter")
public class IpFilter extends AbstractFilter {

  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
          throws IOException, ServletException {

      if (!(req instanceof HttpServletRequest)) {
          chain.doFilter(req, res);
          return;
      }

      HttpServletRequest request = (HttpServletRequest) req;

      Set<String> ips = (Set<String>)Component.getInstance("blockedIps");
      if(ips.contains(request.getRemoteAddr())) {
        throw new ServletException("Permission denied");
      }

      chain.doFilter(req, res);

    }
}
person Shervin Asgari    schedule 21.09.2010
comment
Вероятно, есть лучший способ запретить доступ вместо создания исключения. Вероятно, используя ответ для отправки ошибки, но для простоты я просто показал исключение в коде - person Shervin Asgari; 21.09.2010
comment
Спасибо за этот отличный ответ, я попробую. :) - person Dominik Obermaier; 22.09.2010

Если у вас есть сервер Apache перед вашим сервером Jboss, вызов request.getRemoteAddr(); просто даст вам IP-адрес сервера Apache.

Вместо этого используйте заголовок X-Forwarded-For.

Как говорит Плинио, вы можете использовать фильтр. Если вы не хотите этого делать, вы также можете использовать действие страницы.

person Damo    schedule 20.09.2010
comment
спасибо за подсказку с заголовком x-forwarded-for. Очень полезно :) - person Dominik Obermaier; 20.09.2010

Я ничего не знаю для этого. Но вы можете создать простой фильтр (javax.servlet.Filter) и блокировать запросы от набора IP-адресов. Это очень просто.

person Plínio Pantaleão    schedule 16.09.2010