使用 Spring MVC 成功登录后,我仍然可以返回登录页面

Posted

技术标签:

【中文标题】使用 Spring MVC 成功登录后,我仍然可以返回登录页面【英文标题】:After login successfully using Spring MVC still I can came back to login page 【发布时间】:2015-05-21 05:23:22 【问题描述】:

我是第一次使用 Java 和 Spring MVC 实现 Web 应用程序。我还为它实现了登录功能。但是,我遇到了一个问题。

问题:成功登录后,我的 pare 重定向到目标页面,但如果我在浏览器中键入登录页面,尽管会话处于活动状态,但它会再次显示登录页面。

理想情况下,它应该转到默认目标页面。 Bellow 是我的 XML 设置文件。感谢您提前提供任何帮助。

XML 配置:

<http pattern="/resources/**" security="none" />
<http pattern="/admin/login" security="none" />
<http pattern="/admin/login/failed" security="none" />
<http pattern="/admin/login/invalidsession" security="none" />

<http auto-config="true"  use-expressions="false">
	<intercept-url pattern="/admin/**" access="ROLE_USER" />
	<form-login login-page="/admin/login" default-target-url="/admin/student" authentication-failure-url="/admin/login/failed" />
	<logout logout-success-url="/admin/login" delete-cookies="JSESSIONID" />
	<session-management session-fixation-protection="newSession" invalid-session-url="/admin/login/invalidsession">
       	<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    </session-management>
</http>

<authentication-manager alias="authenticationManager">
	<authentication-provider>
		<user-service>
			<user name="roul" password="roul" authorities="ROLE_USER" />
		</user-service>
	</authentication-provider>
</authentication-manager>

回答:

在得到 jgr 和 Paul 的建议后,我终于可以完成了。在这里,我必须修改我的 XML 配置,因为我将登录页面设置为“无”安全性。因此,在使用以下代码获取该页面的身份验证类型时:

认证授权 = SecurityContextHolder.getContext().getAuthentication();

然后我得到了空值。所以为了避免这种情况,我不得不如下更改 XML 设置。

更新的 XML 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/security
                           http://www.springframework.org/schema/security/spring-security-3.2.xsd">

    <security:global-method-security secured-annotations="enabled" />
    
    <security:http auto-config="true">
        <!-- Restrict URLs based on role -->
        <security:intercept-url pattern="/admin/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/admin/login/failed" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/admin/login/invalidsession" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <security:intercept-url pattern="/admin/**" access="ROLE_USER" />

        <!-- Override default login and logout pages -->
        <security:form-login login-page="/admin/login"
                             default-target-url="/admin/student" 
                             authentication-failure-url="/admin/login/failed" />
        <security:logout logout-success-url="/admin/login" delete-cookies="JSESSIONID" />
        <security:session-management session-fixation-protection="newSession" invalid-session-url="/admin/login/invalidsession">
        	<security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    	</security:session-management>
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
			<security:user-service>
				<security:user name="roul" password="roul" authorities="ROLE_USER" />
			</security:user-service>
		</security:authentication-provider>
    </security:authentication-manager>

</beans>

注意:我参考了以下网址:http://www.springbyexample.org/examples/simple-spring-security-webapp-spring-config.html

【问题讨论】:

【参考方案1】:

您可以使用 authenticationsuccesshandler =

完成此操作

这篇文章解释了How to redirect to the homepage if the user accesses the login page after being logged in?

<beans:bean id="authenticationSuccessHandler"
    class="com.example.spring.security.MyAuthenticationSuccessHandler">
<beans:property name="defaultTargetUrl" ref="defaultTargetUrl" />

Spring Security - Redirect if already logged in

【讨论】:

嘿,帖子似乎很旧,他们已经描述了一个非常旧版本的解决方案。请为 3.2.6.RELEASE spring security 提出一些建议。 我做了一些研究..这似乎是 spring sec 的一个常见问题。浏览了这些帖子后,我还没有看到不同的方法...... 您是否尝试过在安全上下文中签入该帖子中提到的用户? 类似帖子 - ***.com/questions/13131122/…【参考方案2】:

使用 spring security http config 在您的应用程序中配置记住我 http://docs.spring.io/spring-security/site/docs/3.2.6.RELEASE/reference/htmlsingle/#remember-me

<http>
  ...
  <remember-me key="myAppKey"/>
</http>

【讨论】:

不要求记住我的选项。【参考方案3】:

只需在“/admin/login”控制器中添加一些代码即可检查用户是否已登录。

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

    if (!(auth instanceof AnonymousAuthenticationToken))
    
        return "redirect:/admin/student";
    

【讨论】:

以上是关于使用 Spring MVC 成功登录后,我仍然可以返回登录页面的主要内容,如果未能解决你的问题,请参考以下文章

在使用带有JSP页面的Spring MVC时获得错误500

使用 Spring Security 成功登录后如何正确更新登录日期时间?

在asp.net mvc中注册成功(重定向到登录)后用户名自动填写登录页面

使用 Spring Security 成功登录后如何正确更新登录日期时间?

第一次成功登录 MVC .NET 5 OWIN ADAL OpenIDConnect 后,第二次登录导致无限重定向循环

Spring - Java EE 用户在身份验证后仍然为空