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 - 如果已经登录则重定向的主要内容,如果未能解决你的问题,请参考以下文章
2022-06-12 spring security 配置json登录filter