已登录用户的 Spring 安全重定向问题

Posted

技术标签:

【中文标题】已登录用户的 Spring 安全重定向问题【英文标题】:Spring security Redirection issue for already logged-in users 【发布时间】:2012-09-20 05:09:34 【问题描述】:

在使用基于 GWT 的 Web 应用程序实现 Spring Security 时。我找到。 一切都按预期正常工作,除了以下事实:

我打开了 login.jsp 并提供了我的有效用户登录凭据。 提交后,成功重定向到首页。现在,当我在地址栏中编辑 login.jsp 的 URL 时……令人惊讶的是,它允许打开我的 login.jsp,但据我所知……它不应该允许返回 login.jsp,除非我我已登录。

可能是我的 security-context.xml 文件配置不正确。

下面是我的 security-application-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- - Sample namespace-based configuration - -->

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">

    <global-method-security secured-annotations="enabled">
    </global-method-security>

    <beans:bean id="customAuthenticationProcessingFilter"
        class="edu.authentication.CustomAuthenticationProcessingFilter">
        <custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
        <beans:property name="defaultTargetUrl" value="/Home.html?gwt.codesvr=127.0.0.1:9997" />
        <beans:property name="authenticationFailureUrl" value="/login.jsp?login_error=1" /> 
        <beans:property name="authenticationManager" ref="authenticationManager" />
    </beans:bean>

    <beans:bean id="authenticationProcessingFilterEntryPoint"
        class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
        <beans:property name="loginFormUrl" value="/login.jsp" />
        <beans:property name="forceHttps" value="false" />
    </beans:bean>

    <beans:bean id="customUserDetailsService"
        class="edu.authentication.CustomUserDetailsService">
        <beans:property name="urmService" ref="urmService" />
    </beans:bean>

    <http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint">

    <intercept-url pattern="/login.jsp*" filters="none" />
        <intercept-url pattern="/forgot_password.jsp*" filters="none" />
        <intercept-url pattern="/forgotPasswordServlet.do*" filters="none" />

    <intercept-url pattern="/myApp/**" access="IS_AUTHENTICATED_FULLY"/>
        <intercept-url pattern="/gwt/**" access="IS_AUTHENTICATED_FULLY"/>
        <intercept-url pattern="/*.html" access="IS_AUTHENTICATED_FULLY"/>

    <logout logout-url="/j_spring_security_logout"
            invalidate-session="true" logout-success-url="/login.jsp?loggedout=true"/>
    </http>

    <authentication-manager alias="authenticationManager" />

    <authentication-provider user-service-ref="customUserDetailsService">
        <password-encoder hash="md5" />
    </authentication-provider>

</beans:beans>

任何帮助/建议都非常适用..

【问题讨论】:

我刚刚回复了similar question here。 只是一个建议,在发布代码sn-ps时,尝试编辑原始包名以隐藏您的真实项目信息。从包名来看,我猜这个配置来自 onmobile.com 的“Campaign Management”产品 How to redirect to the homepage if the user accesses the login page after being logged in?的可能重复 【参考方案1】:

您也可以创建一个 Servlet 过滤器:

public class LoginPageFilter implements Filter

   public void init(FilterConfig filterConfig) throws ServletException   
   

   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,   FilterChain filterChain) throws IOException, ServletException
   
       HttpServletRequest request = (HttpServletRequest) servletRequest;
       HttpServletResponse response = (HttpServletResponse) servletResponse;

       if(request.getUserPrincipal() != null) //If user is already authenticated
           response.sendRedirect("");// or, forward using RequestDispatcher
        else
           filterChain.doFilter(servletRequest, servletResponse);
       
   

   public void destroy() 
   

web.xml:

登录页面过滤器 com.xxx.xx.LoginPageFilter

<filter-mapping>
    <filter-name>LoginPageFilter</filter-name>
    <url-pattern>/login</url-pattern>
</filter-mapping>

【讨论】:

【参考方案2】:

Spring Security 没有内置任何东西来阻止您在登录后查看登录页面。您可以通过在登录页面顶部添加以下代码来阻止登录页面。

<%@ taglib prefix='sec' uri='http://www.springframework.org/security/tags' %>
<sec:authorize ifNotGranted="ROLE_ANONYMOUS">
  <% response.sendRedirect("/mainpage.jsp"); %>
</sec:authorize>

逻辑是,如果用户没有登录,Spring Security 会为他们创建一个匿名的 Authentication 对象,并为他们提供 ROLE_ANONYMOUS 的角色。因此,您只需检查用户是否具有该角色,如果没有,您可以假定他们已登录并将他们重定向到应用程序的主页。

【讨论】:

以上是关于已登录用户的 Spring 安全重定向问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring安全重定向到登录并恢复之前输入的表单数据

Spring Boot 安全性 403 重定向

使用Spring Social,Spring安全登录后重定向到原始URL?

会话超时后,Spring 安全性不会重定向到上次请求的页面登录

Spring 安全重定向到登录页面以获取经过身份验证的 url

登录成功后访问登录页面时出现Spring安全访问被拒绝消息。它应该重定向到默认页面