30

我是春天的新手:

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

4 回答 4

55

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

  1. 检查用户是否登录。

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

相关代码:

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";
}
于 2012-10-30T04:29:42.040 回答
8

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

在您的 jsp 顶部添加一个安全 taglib 标头:

<%@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 完成所有重定向工作,所以没有登录控制器可供我修改。

于 2016-03-01T10:54:12.620 回答
3

登录.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();
        }
    }
}
于 2015-04-01T22:49:47.810 回答
2

嘿,你可以这样做。

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

这种方法非常简单方便,不是吗?

于 2015-01-31T22:02:18.093 回答