2012-04-26 3 views
0

У меня есть метод в моем ресурсе с аннотацией @RequiresGuest. Когда вход в систему пользователя попадает в ссылку, он по праву выбрасывает UnauthenticatedException с этим сообщениемКак обрабатывать UnauthenticatedException с Shiro

Попытка выполнить операцию только для гостя. Текущий объект не гость (они были аутентифицированы или запомнены с предыдущего входа). Доступ закрыт.

Но как мне его обрабатывать? Как мне, например, перенаправить запрос на выход на страницу?

ответ

1

Это, как правило, зависит от выбранной структуры MVC:

  • Некоторые механизмы пользовательского интерфейса (например, JSP) позволяют вам иметь «страницу ошибки», которую можно использовать для обработки любого исключения.
  • Более элегантные интерфейсы пользовательского интерфейса имеют «улавливать все» обработчики и/или контроллеры исключений, которые позволяют вам делать все, что вы хотите (проверяйте исключение, устанавливаете код состояния HTTP, перенаправляете конечного пользователя на страницу с ошибкой, специфичную для этой конкретной проблемы , и т.д).

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

Фильтр будет выполнять FilterChain в/поймать блок Ьгу , перехватывая исключение AuthorizationException. Если он ловит один, он выдает 302 перенаправление на «unauthorizedUrl».

Причина существующих фильтры Широ не делают это потому, что они разрешают Субъект перед когда-либо вызов FilterChain: , если тема не соответствуют критериям авторизации, цепочки фильтров никогда даже не вызывается (и, следовательно, нет Авторизация Исключение для catch).

Если вы хотите увидеть альтернативное поведение в Сиро, напишите issue и обсудите его как потенциальную новую функцию.

+0

В Shiro 1.2.1 любое исключение Shiro обернуто в общее представление ServletException. См. AbstractShiroFilter.doFilterInternal. Таким образом, захват ShiroException в вашем фильтре не будет работать. –

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