bindInterceptor против фильтра для безопасности?

У меня есть простой случай использования, когда я хочу получить переменную сеанса в начале сеанса и разрешить доступ только к определенным страницам на основе результата. Я не совсем уверен, лучше ли это использовать bindInterceptor для перехвата любого метода @Get или @Post на любой странице, или лучше использовать фильтр. Вот набросок того, что я хотел бы сделать, но я открыт для альтернатив:

At the start of a new session (@SessionScoped ?), check a session variable authentication token

If (authentication == admin) {
    serveRegex("admin/(jsp|html)/.*").with(GuiceContainer.class);   //only allow /admin subpages
    req.getRequestDispatcher("/admin").forward(req, res); //fwd all initial page requests to /admin
}
else If (authentication == user) {
    serveRegex("user/(jsp|html)/.*").with(GuiceContainer.class);  //only allow /user subpages
    req.getRequestDispatcher("/user").forward(req, res); //fwd all initial page requests to /user
}
else {
    serveRegex("signin/(jsp|html)/.*").with(GuiceContainer.class);  //only allow /signin subpages
    req.getRequestDispatcher("/signin").forward(req, res);  //fwd all initial page requests to /signin
}

Какой метод является предпочтительным (наименьший код, самый быстрый и т. Д.) Для управления этой моделью безопасности? Я хотел бы увидеть пример проекта.

Спасибо за вашу помощь!

-John

1 ответ

Решение

Обычный способ сделать это - использовать фильтр. Учитывая, что вы, кажется, разделяете пространство URI для различных необходимых разрешений, это также, вероятно, самый простой способ. Стиль bindInterceptor полезен, если вы хотите, чтобы логика аутентификации была объявлена ​​в методах / классах ("@AdminRequiredили что-то в этом роде), но на самом деле нет веской причины для этого - разделить пространство URI проще.

Просто свяжите Фильтр, который получает текущую логику пользователя / авторизации и проверяет, соответствуют ли разрешения URI, к которому направляется запрос.

Например

class AuthenticationFilter implements Filter {

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    User user = getUserSomehow();
    if (user == null) {
      response.sendRedirect(... login page ...);
      return;
    }
    if (request.getRequestURI().startsWith("/admin")) {
      // Enforce Admin login, error out otherwise.
    }
    // Proceed with executing the request.
    chain.doFilter(request, response);
  }
}

Обратите внимание, что вам придется понизить запрос ServletRequest/Response до HttpServletRequest/Response.

Другие вопросы по тегам