2012-10-29 56 views
22

我是新来的弹簧:弹簧安全 - 重定向如果已经登录

我不希望经过身份验证的用户访问登录页面。如果用户已经通过身份验证,处理'/ 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> 
+0

可能重复[如果用户在登录后访问登录页面,如何重定向到主页?](http://stackoverflow.com/questions/12597519/how-to-redirect-to-the-homepage -if-the-user-access-the-login-page-after-being) – Xaerxess

+0

http://stackoverflow.com/questions/32225414/spring-security-login-issue-after-re-login-in-same-会话/ 32325358#32325358 此问题已在此链接上解决。请查看 – parshant

回答

35

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

  1. 检查,如果用户登录

  2. 再往前他索引页在这种情况下。

相关代码:

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

if (!(auth instanceof AnonymousAuthenticationToken)) { 

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

这只适用于登录 - >家庭等情况。如果我已经登录并在地址栏中输入登录网址,怎么办?这将是有道理的重新导向到主页(或我已经在哪里)... –

+0

它为我工作。谢谢 – zameer

0

嘿,你能做到这一点。

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

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

1

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(); 
     } 
    } 
} 
5

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

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

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

然后添加以下标记你的“头”标签内(最好是靠近顶部):

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

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

通过控制器做到这一点并不适合我,因为有效的登录页面的做法是让spring security的“表单登录”bean完成所有的重定向工作,所以没有登录控制器可以修改。