我是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>
答案 0 :(得分:47)
在登录页面的控制器功能中:
检查用户是否已登录。
然后将他转发到索引页面。
相关代码:
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();
}
}
}