我有一个使用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开箱即用吗?如果没有,实现它的正确方法是什么?

最佳答案

您可以自行处理登录请求,也可以使用框架,需要将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");
}

这不是一个完全可用的解决方案。我不确定是否可以在身份验证之外获取成功网址,可以手动重定向WebUtils.issueRedirect(req, resp, url)

08-06 01:51