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

时间:2012-10-29 23:25:36

标签: spring spring-security

我是Spring的新手:

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

答案 0 :(得分:47)

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

  1. 检查用户是否已登录。

  2. 然后将他转发到索引页面。

  3. 相关代码:

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    
    if (!(auth instanceof AnonymousAuthenticationToken)) {
    
        /* The user is logged in :) */
        return new ModelAndView("forward:/index");
    }
    

答案 1 :(得分:7)

要成功从登录页面重定向,如果用户已登录,请将以下内容添加到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执行所有重定向工作,因此没有登录控制器供我修改。

答案 2 :(得分: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>

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

答案 3 :(得分:2)

login.xhtml

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

loginBean

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