Tomcat SecurityFilter и авторизация - PullRequest
1 голос
/ 29 января 2011

Я реализовал простой фильтр, который просто добавляет два Принципа к текущей сессии (см. DoFilter ниже).Моя проблема в том, что это происходит, когда я запрашиваю ресурс, но тогда я никогда не смогу увидеть ресурс, потому что появляется экран входа в систему на основе FORM.Я пытаюсь обойти вход в систему на основе формы с помощью этого конкретного фильтра (в конечном итоге используя маркер быстрого истечения срока действия), хотя, похоже, ничто не позволяет мне сделать это.

public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
  HttpServletRequest httprequest = (HttpServletRequest)request;
  HttpServletResponse httpresponse = (HttpServletResponse)response;
  HttpSession session = httprequest.getSession(true);
  Subject subject = (Subject)session.getAttribute("javax.security.auth.subject");

  if (subject == null){
   subject = new Subject();
   PlainUserPrincipal user = new PlainUserPrincipal("admin");
            PlainRolePrincipal role = new PlainRolePrincipal("admin");
   subject.getPrincipals().add(user);
   subject.getPrincipals().add(role);
  }

  chain.doFilter(httprequest, httpresponse);
 }

1 Ответ

1 голос
/ 07 марта 2011

По соображениям безопасности вы не можете сопоставить сервлеты / фильтры с шаблоном URL-адреса /j_security_check при запуске Tomcat. Симптомы указывают на то, что вы делаете это. Я говорю конкретно Tomcat, потому что я видел случаи, когда он работает на других (определенных) контейнерах / версиях. Но вы не хотите зависеть от этого.

Скорее фильтруйте на /* или, по крайней мере, тот же шаблон URL, что и ограничение безопасности, и перехватывайте присутствие основного пользователя и отсутствие объекта сеанса.

if (request.getUserPrincipal() != null && session.getAttribute("subject") == null) {
    Subject subject = new Subject();
    // ...
    session.setAttribute("subject", subject);
}

chain.doFilter(request, response);
...