当前位置: 首页 > 知识库问答 >
问题:

如果用户已经过身份验证,如何将请求重定向到已配置的 Shiro loginUrl?

宋琛
2023-03-14

我有一个使用Shiro进行身份验证的网络应用程序。网站的相关部分。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开箱即用,这可能吗?如果没有,正确的实现方法是什么?

共有2个答案

羊舌成周
2023-03-14

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

<%
    if (SecurityUtils.getSubject().isAuthenticated()) {
        response.sendRedirect(request.getContextPath());
    }
%>
邢臻
2023-03-14

您可以自己处理登录请求,也可以使用您的框架,您需要更改<code>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,您可以手动重定向< code > webutils . issue redirect(req,resp,url)

 类似资料:
  • 我正在使用ApacheShiro开发JSF应用程序。我用Shiro引诱用户,并将其重定向到主页。这没有问题。验证后,当我尝试访问登录页面时,它不会将我重定向到主页。即使已经有loggedin用户,我也可以再次登录。正如巴卢斯克在他的博客文章中提到的,我正在进行程序登录。 这个滤镜是根据博文写的。 } 问题是什么?如果用户已经通过身份验证,我该如何重定向用户? 编辑:现在,如果用户已经通过身份验证,

  • 我的代码在这里:代码重新发布是因为我想问一个更直接的问题。如何在未经身份验证的用户和经过身份验证的用户之间切换?我的未经验证的文件似乎已缓存,我使用了以下方法: 在我剩下的api代码之前,它仍然不能工作。谢谢你的帮助 注意:我知道它不起作用,因为我在切换配置/凭据提供程序后立即使用lambda进行调用,并且只有授权用户才能调用此方法。 编辑@behrooziAWS答案: API代码: 完整错误:B

  • Flatter Web(Navigator 2.0/Router API):如何处理经过身份验证的路由及其成功身份验证后的重定向? e、 g.我的系统中有这种路由 若用户直接打开这个URL,我想让用户先登录,那个么路由将被重定向到。。 一旦登录,我想用户导航以前打开的网址,如果有任何其他主页。。 似乎这种事情可能会有所帮助,任何想法——我们如何才能实现类似的事情?https://stackover

  • 经过身份验证的请求可用于获取授权代码令牌,以访问系统中的所有者资源。 对授权端点发出的请求会导致用户身份验证,并在向授权端点发送请求时提供明确的凭据。 经过身份验证的请求包含以下参数 - response_type - 这是一个必需参数,用于将值设置为'code',用于请求授权代码。 如果授权请求中没有'response_ type'参数,则授权服务器返回错误响应。 由于无效或不匹配的重定向URI

  • 问题内容: 未验证用户身份时如何处理ajax请求? 有人进入页面,留出一个小时的空间,返回,然后使用jQuery()在通过ajax的页面上添加评论。由于未通过身份验证,因此方法返回RedirectToRoute结果(重定向到登录页面)。你用它做什么?您如何在客户端处理它,以及如何在控制器中处理它? 问题答案: 编辑: 我很久以前就写了以上答案,现在我认为发送403不是正确的方法。403的含义略有不

  • 谢谢GitHub团队 如何重置身份验证以输入github令牌(https://github.com/settings/tokens)而不是密码?