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

如何将已通过身份验证的用户从登录页面重定向到主页

幸阳波
2023-03-14

我正在使用ApacheShiro开发JSF应用程序。我用Shiro引诱用户,并将其重定向到主页。这没有问题。验证后,当我尝试访问登录页面时,它不会将我重定向到主页。即使已经有loggedin用户,我也可以再次登录。正如巴卢斯克在他的博客文章中提到的,我正在进行程序登录。

[main]
credentialsMatcher = org.apache.shiro.authc.credential.PasswordMatcher
myRealm = com.example.security.myRealm
myRealm.credentialsMatcher = $credentialsMatcher
securityManager.realms = $myRealm
user = com.example.web.filter.FacesAjaxAwareUserFilter
user.loginUrl = /login.xhtml

[urls]
/login.xhtml = user

这个滤镜是根据博文写的。

public class FacesAjaxAwareUserFilter extends UserFilter {

private static final String FACES_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        + "<partial-response><redirect url=\"%s\"></redirect></partial-response>";

@Override
protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
    HttpServletRequest req = (HttpServletRequest) request;
    if ("partial/ajax".equals(req.getHeader("Faces-Request"))) {
        response.setContentType("text/xml");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().printf(FACES_REDIRECT_XML, req.getContextPath() + getLoginUrl());
    }
    else {
        super.redirectToLogin(request, response);
    }
}

}

问题是什么?如果用户已经通过身份验证,我该如何重定向用户?

编辑:现在,如果用户已经通过身份验证,我将使用PostConstruct注释进行重定向。我愿意考虑任何好的解决办法。

共有1个答案

年风华
2023-03-14

验证后,当我尝试访问登录页面时,它不会将我重定向到主页。即使已经有loggedin用户,我也可以再次登录

Shiro和自定义Shiro用户过滤器都不是为了防止这种情况。Shiro没有这方面的内置设施。自定义Shiro用户筛选器仅在找到未经身份验证的用户时运行,而不是在找到已经身份验证用户时运行。

阻止经过身份验证的用户直接访问登录页面是您自己的责任。根据业务要求,您可以执行以下操作:

>

  • 就让它吧。也许用户只是想切换登录。如有必要,您可以有条件地显示以下消息:

      <ui:fragment rendered="#{not empty request.remoteUser}">
          You are already logged-in as #{request.remoteUser}.
          By logging in as another user, you will be logged out.
      </ui:fragment>
      <h:form id="login">
          ...
      </h:form>
    

    不允许,但保持在同一个页面中。有条件地隐藏登录表单并显示如下消息:

      <ui:fragment rendered="#{not empty request.remoteUser}">
          Hey, how did you end up here?
          You are already logged-in as #{request.remoteUser}!
      </ui:fragment>
      <h:form id="login" rendered="#{empty request.remoteUser}">
          ...
      </h:form>
    

    当然,当用户已经登录时,请确保您的Web应用程序没有登录链接。

    不要允许它并重定向到所需的目标页面。这可以通过多种方式来完成。最干净的方法是使用servlet过滤器。

      @WebFilter(urlPatterns = "/login.xhtml")
      public class LoginPageFilter implements Filter {
    
          @Override
          public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
              HttpServletRequest request = (HttpServletRequest) req;
              HttpServletResponse response = (HttpServletResponse) res;
    
              if (request.getRemoteUser() != null) {
                  response.sendRedirect(request.getContextPath() + "/home.xhtml"); // Redirect to home page.
              } else {
                  chain.doFilter(req, res); // User is not logged-in, so just continue request.
              }
          }
    
          // Add/generate init() and destroy() with NOOP.
      }
    

    您也可以在preRenderView事件侦听器中执行此操作。@PostConstruct可能为时已晚,因为此时可能已经提交了响应。请注意,在没有任何形式反馈的情况下重定向可能会让最终用户感到困惑。在过滤器中,考虑传递一个应触发条件消息的附加参数。或者在preRenderView事件侦听器中,设置一个flash范围的消息。

  •  类似资料:
    • 在不生成Laravel默认身份验证控制器的情况下,我创建了自己的登录和注册控制器。 我的路线是这样的 用于登录 登记 一切都很好。现在我需要一件事。每当我放置中间件时,一个未经身份验证的用户将被重定向到我的自定义登录页面路由到。 如何做到这一点?

    • 问题内容: 编辑:忘记提及我与AngularJs在一起仅一周了,因此,如果您看到某些东西,您认为应该做得更好,并且与问题无关,请随时在评论部分告诉我。 好的,所以我有我的身份验证控制器和提供程序,由于它们与问题范围无关,因此将不显示。然后,我有一个拦截器来检查拨打电话时用户是否已通过身份验证。如果是这样,我将请求的标头设置为包括用户的Token(如果没有),则将用户重定向到登录页面,甚至不向服务器

    • 试图阻止来宾用户的路由。当有人点击时,它将检查用户是否以管理员身份登录。如果admin然后它工作正常,如果代理然后它重定向到登录页面,但如果我作为访客用户点击链接,它不会将我重定向到登录页面,而是显示一些错误: 路由中的错误异常。php第53行:尝试获取非对象的属性。 这是我的路线。php文件:

    • 我在auth中间件方面遇到了一些问题。我将中间件放在一个路由组中,并回滚了users表。我希望应用程序将我重定向到我的登录/搜索页面,但它没有这样做,它只是给了我“尝试获取非对象的属性”,它指的是我的仪表板视图中的函数(我不应该访问该函数)。 这是我的路线代码: 以下是我的观点: 另外,我不确定从数据库中删除用户是否意味着Laravel将自动删除用户会话。 谢谢你的帮助!

    • Java 6 Servlet 2.5 WebLogic 12.1 Spring MVC 4.3.4.release Spring Security 4.2.0.版本 我实现了一个CustomAuthenticationProvider来根据Oracle db对用户进行身份验证:用户实际上是db用户,因此我尝试连接到db以检查用户/密码,如果结果是肯定的,则加载权限。 除非发生登录错误,否则配置工作

    • 我使用Laravel 5.2。我想问一个问题。如何更改重定向登录表单在laravel当我们已经做登录?我使用的是来自Php artisan make: auth的auth。 我已经登录并重定向到localhost:8000/admin 然后我再次打开localhost:8000/登录。它将重定向到“/”或localhost:8000/ 我的问题是如何将“/”更改为“/”管理员“?因此,即使我已经登