2013-09-15 4 views
0

Я использую JDBCRealm для проверки подлинности и авторизации в своем веб-приложении. Что касается аутентификации, я использую FORM с сервисом j_security_check. Я настроил все, включая страницу ошибки HTTP Status 403, где пользователь будет перенаправлен, если у него/нее нет необходимых разрешений для доступа к ресурсу. До сих пор все работает нормально. Проблема возникает, когда возвращается ошибка HTTP Status 403. Мне кажется, что, несмотря на то, что пользователь не был авторизован, сеанс JSF по-прежнему создается для этого пользователя, если он/она успешно аутентифицирован. Теперь, когда я попытаюсь вернуться на страницу входа и ввести пароль и имя пользователя пользователя, у которого есть разрешение на доступ к ресурсу, он не может разрешить, поскольку авторизация все еще применяется к пользователю, имеющему текущий сеанс, который, по-видимому, не имеет требуемое разрешение. Теперь мне нужно знать, как уничтожить или аннулировать такой сеанс, созданный при возврате статуса HTTP 403. спасибоКак уничтожить сеанс JSF, созданный после статуса Http 403

UPDATE: Я думаю, что важно отметить, что когда сеанс завершен, я теперь могу войти в систему с пользователем, у которого есть необходимые разрешения. только кончик ...

+0

Почему сеанс создан на первом месте? По умолчанию JSF этого не делает, пока это необязательно. У вас есть форма на странице с ошибкой и/или вы ссылаетесь на объекты в режиме просмотра/сеанса на странице ошибок? Если да, то почему именно? Если вы не уверены, реализуйте 'HttpSessionListener # sessionCreated()', поместите контрольную точку и запустите отладчик, чтобы увидеть в стеке вызовов, которые его вызывали и почему. – BalusC

+0

@BalusC Большое спасибо за отзыв, у меня нет формы на моей странице ошибки, и я не ссылаюсь ни на какой bean-компонент. Позвольте мне сделать то, что вы предложили выше, и я вернусь к вам, спасибо .. –

+0

@BalusC после выполнения вышеописанного HttpSessionListener # sessionCreated() не отображает вызывающего абонента в иерархии вызовов, но, похоже, событие происходит от org .apache.catalina.session.StandardSessionFacade –

ответ

1

Простой !! ... Вы можете настроить его в Web.xml

Просто определить код ошибки в Web.xml, так что произойдет, когда ваша страница загружается вид Если 403 брошено означает, что определенная страница ошибки будет вызываться автоматически.

Код:

<error-code>403</error-code> 
     <location>/error.xhtml</location> 
</error-page> 

В странице ошибки ..you может сделать питание, что вы хотите ..

Чтобы убить текущую сессию лучшего метод invalidate session through FacesContext

HttpServletRequest request=HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 

После этого выполнения кода currect session будет расторгнут

+0

, пожалуйста, перейдите к моему вопросу. Я уже сделал это успешно, я хочу знать, как уничтожить сеанс, созданный после этого. –

+0

@ Не вижу моего отредактированного ответа – kark

0

У меня была такая же проблема, но я использую калитку. Таким образом, в качестве страницы ошибки определены следующие JSP:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
     <title>User Authorization Error (403)</title> 
    </head> 
    <body> 
     <% 
      String userName = "<No User>"; 
      String contextPath = request.getContextPath(); 
      java.security.Principal principal = request.getUserPrincipal(); 
      if (principal != null) userName = principal.getName(); 
      request.getSession().invalidate(); 
     %> 
     <h2>The user '<%=userName %>' is not authorized to access the page</h2> 
     <p> 
      <a href="<%= contextPath %>/protected">Login again with an authorized user</a> 
     </p> 
    </body> 
</html> 
+0

@thymayr: JSP для последних версий JSF «устарел», поэтому в этом отношении ответ «нехорошо». – Kukeltje

Смежные вопросы