13

我有一个使用 Shiro 进行身份验证的 webapp。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 )会将您重定向到收件箱。Shiro开箱即用,这可能吗?如果不是,那么实施它的正确方法是什么?

4

2 回答 2

2

您可以自己处理登录请求或使用您的框架,您需要更改您shiro.ini以使用PassThruAuthenticationFilter

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

您现在可以检查用户是否已登录,如果为真则重定向:

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)

于 2013-01-02T20:33:05.877 回答
1

我遇到了同样的问题并通过将登录页面转换为 JSP 并在开头添加重定向来解决它:

<%
    if (SecurityUtils.getSubject().isAuthenticated()) {
        response.sendRedirect(request.getContextPath());
    }
%>
于 2017-01-27T08:37:44.287 回答