Подтвердить что ты не робот

Как я могу перенаправить запросы на настроенный Shiro loginUrl, если пользователь уже прошел аутентификацию?

У меня есть webapp, использующий Shiro для аутентификации. Соответствующими частями web.xml и shiro.ini являются:

<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

и

[main]
authc.loginUrl = /authoring/login.html
authc.successUrl  = /authoring
logout.redirectUrl = /authoring/login.html

[users]
foo = foo

[urls]
/authoring/logout = logout
/authoring/** = authc

Shiro корректно перехватывает все запросы от клиентов, не прошедших проверку подлинности, и перенаправляет на сконфигурированный loginUrl (а затем перенаправляет их на запрашиваемую страницу после успешной проверки подлинности). То, что я хотел бы иметь, заключается в том, что если аутентифицированный клиент делает явный запрос /authoring/login.html, перенаправляет это на /authoring. Это будет ТОЛЬКО, если клиент аутентифицирован.

Например, подумайте о том, как работает Gmail, пытаясь получить доступ к mail.google.com(или даже https://accounts.google.com/ServiceLogin), когда вы уже вошли в систему, перенаправляет вас в папку "Входящие". Возможно ли это с Сиро из коробки? Если нет, то какой правильный способ его реализовать?

4b9b3361

Ответ 1

Вы можете обрабатывать запрос на вход самостоятельно или используя свою фреймворк, вам нужно будет изменить shiro.ini на PassThruAuthenticationFilter

authc = org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter

Теперь вы можете проверить, зарегистрирован ли пользователь и перенаправить его, если true:

Subject currentUser = SecurityUtils.getSubject();
if(currentUser.isAuthenticated()){
    //redirect
}else{
    AuthenticationToken token =  new UsernamePasswordToken(username, password);
    currentUser.login(token);
    WebUtils.redirectToSavedRequest(request, response, "index.xhtml");
}

Это не совсем готовое решение. Я не уверен, что вы можете получить URL-адрес успеха вне аутентификации, вы можете вручную перенаправить WebUtils.issueRedirect(req, resp, url)

Ответ 2

Я столкнулся с той же проблемой и работал вокруг нее, переместив страницу входа в JSP и добавив перенаправление в начале:

<%
    if (SecurityUtils.getSubject().isAuthenticated()) {
        response.sendRedirect(request.getContextPath());
    }
%>