Spring Security - 如果已经登录则重定向

Posted

技术标签:

【中文标题】Spring Security - 如果已经登录则重定向【英文标题】:Spring Security - Redirect if already logged in 【发布时间】:2012-10-19 07:52:10 【问题描述】:

我是 Spring 新手:

我不希望经过身份验证的用户访问登录页面。如果用户已经通过身份验证,处理“/登录”重定向的正确方法是什么?比如说,如果已经登录,我想重定向到“/index”。

我在登录时尝试了“isAnonomous()”,但它重定向到访问被拒绝的页面。

<security:http auto-config="true" use-expressions="true" ...>
    <form-login login-processing-url="/resources/j_spring_security_check"
                 default-target-url="/index"
                login-page="/login" authentication-failure-url="/login?login_error=t" />
    <logout logout-url="/resources/j_spring_security_logout"  />
   ...
  <security:intercept-url pattern="/login" access="permitAll" />
  <security:intercept-url pattern="/**" access="isAuthenticated()" />
</security:http>

【问题讨论】:

How to redirect to the homepage if the user accesses the login page after being logged in?的可能重复 ***.com/questions/32225414/… 这个问题在这个链接上解决了。请看一下 【参考方案1】:

在您的登录页面的控制器功能中:

    检查用户是否登录。

    然后在这种情况下将他转发/重定向到索引页面。

相关代码:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (!(auth instanceof AnonymousAuthenticationToken)) 

    /* The user is logged in :) */
    return new ModelAndView("forward:/index");

更新

或者在另一种情况下,映射可能包含path variable,例如@GetMapping(path = "/user/id"),在这种情况下,您也可以实现此逻辑:

@GetMapping(value = "/login")
public String getLogin() throws Exception 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    if (!(auth instanceof AnonymousAuthenticationToken)) 
        User loggedInUser = userService.findByEmail(auth.getName())
                    .orElseThrow(Exception::new);
        /* The user is logged in :) */
        return "redirect:/user/" + loggedInUser.getUserId();
    
    return "login";

【讨论】:

这仅适用于登录 -> 主页等情况。如果我已经登录并在地址栏中输入登录网址怎么办?再次重定向到主页(或我已经在的任何地方)是有意义的......【参考方案2】:

要从登录页面成功重定向,如果用户已经登录,请将以下内容添加到您的 login.jsp:

在你的jsp顶部添加一个安全标签库头:

<%@taglib uri="http://www.springframework.org/security/tags" prefix="sec"%>

然后在“head”标签内添加以下标签(最好靠近顶部):

<sec:authorize access="isAuthenticated()">
    <% response.sendRedirect("main"); %>
</sec:authorize>

如果访问登录页面的用户已经登录,这将重定向到 main.html(或您的主 .jsp 映射到的任何内容)。

通过控制器执行此操作对我来说不起作用,因为有效的登录页面做法是让 spring security 的“form-login”bean 完成所有重定向工作,所以没有登录控制器可供我修改。

【讨论】:

【参考方案3】:

login.xhtml

<h:head >
    <f:metadata>
      <f:event type="preRenderView" listener="#loginBean.onPageLoad"/>
  </f:metadata>
</h:head>

登录豆

public void onPageLoad()
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (!(auth instanceof AnonymousAuthenticationToken)) 
        try 
            FacesContext.getCurrentInstance().getExternalContext().redirect(url);
         catch (IOException e) 
            e.printStackTrace();
        
    

【讨论】:

【参考方案4】:

嘿,你可以这样做。

<h:head>
<sec:authorize access="isAuthenticated()">
    <meta http-equiv="refresh" content="0;url=http://your index.xhtml url (full url)" /> 
</sec:authorize>
</h:head>

这个方法很简单方便吧?

【讨论】:

以上是关于Spring Security - 如果已经登录则重定向的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 打开一个弹出式登录

2022-06-12 spring security 配置json登录filter

Spring Security:如果身份验证失败,则重定向到登录页面

Spring Security(一)

Spring Security 自定义登录回退

Spring Security:在覆盖会话之前显示警告