2013-09-03 1 views
0

Я работаю над безопасностью Spring с года. Сегодня я столкнулся с незначительной проблемой в отношении авторизации в Spring SecurityПеренаправление, когда перехват-url не разрешен весной mvc

Для перехвата URL я настроил мой пружинный security.xml как этого

<intercept-url method="GET" pattern="/groups" access="hasRole('VIEW_GROUPS')" /> 

<intercept-url method="GET" pattern="/admin" access="hasRole('VIEW_ADMIN')" /> 

Это может случиться, что пользователь не имеет никакого роли, чтобы увидеть страницу/групп поэтому в этом случае, как я могу убедиться, что пользователь автоматически перенаправляется на страницу/admin?

Я знаю, что ответ будет простым, но я застрял здесь.

+1

Является ли пользователь, который «не имеет роли для просмотра/группы страниц» уже аутентифицирован? – Ralph

+0

Да, этот пользователь аутентифицируется с использованием собственного поставщика проверки подлинности. – umar

ответ

2

Вы можете сделать перенаправление в обработчике отказа доступа.

Обычно вы будете иметь что-то подобное в вашей конфигурации:

<http ..... > 
    ... 
    <intercept-url method="GET" pattern="/groups" access="hasRole('VIEW_GROUPS')" /> 
    <intercept-url method="GET" pattern="/admin" access="hasRole('VIEW_ADMIN')" /> 
    ... 
    <access-denied-handler error-page="/access-denied" /> 
</http> 

URL/отказе в доступе, как правило, отображает доступ запрещен страницу. Вы можете зарегистрировать контроллер для этого URL-адреса, а затем вы можете проверить контроллер, если у пользователя есть роль «VIEW_ADMIN» и перенаправить его туда. Если вам нужно знать, какой пользователь URL попытался посетить, он должен быть доступен в объекте HttpServletRequest.

EDIT: решение с помощью перехватчика:

Вы можете создать перехватчик Spring MVC. Расширьте HandlerInterceptorAdapter и в методе preHandle проверьте, проверен ли пользователь, проверьте роли и выполните перенаправление.

class MyRoleBasedRedirectorInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     //do the authentication/role/URL checks 
     ... 
     if (needsAdminRedirect) { 
      response.sendRedirect("admin"); 
      return false; 
     } 
     return true; 
    } 

} 

И в конфигурации:

<mvc:interceptors> 
    <bean class="com.example.MyRoleBasedRedirectorInterceptor" /> 
</mvc:interceptors> 

Если вам не нравится оригинальное решение контроллера вы также можете реализовать свою собственную реализацию AccessDeniedHandler и к проверкам там. Вы бы подключить вашу реализацию с

<access-denied-handler ref="com.example.MyAccessDeniedHandler" /> 

Я бы по-прежнему выбираю для решения Controller/AccessDeniedHandler так, если я правильно понял, перенаправление происходит только тогда, когда пользователь не авторизован посетить страницу «Группу».

+0

Можно ли использовать для этого фильтр? В котором мы проверяем, нет ли у пользователя авторизации на некотором URL-адресе перехвата, а затем перенаправлять на другую страницу. – umar

+0

Да, вы можете. Я отредактировал ответ, чтобы включить решение перехватчика. Вы можете сделать это и в сервлет-фильтрах почти одинаковым образом. –

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