Spring security:注销时始终重定向到 invalid-session-url

Posted

技术标签:

【中文标题】Spring security:注销时始终重定向到 invalid-session-url【英文标题】:Spring security: Always redirected to invalid-session-url on logout 【发布时间】:2017-07-13 21:18:39 【问题描述】:

我已经尝试了所有解决方案。我面临两个问题:

    注销重定向到无效会话 url 即使应用程序已注销,会话超时事件也会在每个设置的时间间隔(例如 10 分钟)重复发生。这会导致登录页面提交操作(登录按钮)重定向到 invalid-session-url。因此,如果我注销并在 10 分钟后尝试登录(这是会话超时间隔),登录页面会再次重定向到 login?logout=1 (invalid-session-url),而不是登录应用程序。之后,我就可以登录了。

以下是我在面临上述问题后所做的更改:

我从 http pattern="/login" 更改了 /login 页面访问权限 security="none"intercept-url pattern="/login" access="isAnonymous()" 来实现 csrf。我努力了 也将访问权限切换到 permitall。 我在浏览器中观察到,每次注销时,当前 JSESSIONID 被丢弃并在浏览器中创建一个新的 JSESSIONID,并且注销操作重定向到 invalid-session-url 而不是 注销成功网址。 再次登录时,JSESSIONID 与新登录的相同 注销后创建 JSESSIONID。不应该改变吗?

下面是安全上下文配置:

<http pattern="/" security="none"/>
<!--<http pattern="/login" security="none"/>-->
<http pattern="/resources/assets/**" security="none"/>
<http pattern="/resources/bootstrap/**" security="none"/>
<http pattern="/resources/config/**" security="none"/>
<http pattern="/resources/css/**" security="none"/>
<http pattern="/resources/data/**" security="none"/>
<http pattern="/resources/font-awesome-4.5.0/**" security="none"/>
<http pattern="/resources/fonts/**" security="none"/>
<http pattern="/resources/images/**" security="none"/>

<http  auto-config="false"  use-expressions="true"  entry-point-ref="loginUrlAuthenticationEntryPoint">

    <!--permitall isAnonymous()-->
    <intercept-url pattern="/login" access="isAnonymous()" />
    <intercept-url pattern="/login?logout=1" access="isAnonymous()" />
    <intercept-url pattern="/login?logout=0" access="isAnonymous()" />
    <intercept-url pattern="/login?logout=2" access="isAnonymous()" />
    <intercept-url pattern="/login?error" access="isAnonymous()" />
    <intercept-url pattern="/**" access="isAuthenticated()" />
    <intercept-url pattern="/user/*" access="isAuthenticated()" />
    <intercept-url pattern="/resources/js/angular/**" access="isAuthenticated()" />

    <custom-filter position="FORM_LOGIN_FILTER" ref="customUsernamePasswordAuthenticationFilter" />
    <logout logout-success-url="/login?logout=0" invalidate-session="true" delete-cookies="JSESSIONID" />
    <!--<logout success-handler-ref="customLogoutSuccessHandler" invalidate-session="true" delete-cookies="JSESSIONID"
        newSession/>-->
    <session-management  invalid-session-url="/login?logout=1" session-fixation-protection="migrateSession">
        <concurrency-control max-sessions="1" expired-url="/login?logout=2" />
    </session-management>
    <csrf/>
    <headers/>
</http>

<beans:bean id="loginUrlAuthenticationEntryPoint"
        class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/login"/>
</beans:bean>


<authentication-manager alias="authenticationManager">
    <authentication-provider ref="customAuthenticationProvider"/>
</authentication-manager>

<beans:bean id="customUsernamePasswordAuthenticationFilter"
        class="com.vitrana.hilit.web.security.CustomAuthenticationFilter" >
    <beans:property name="authenticationManager" ref="authenticationManager"/>
    <beans:property name="authenticationFailureHandler" ref="failureHandler"/>
    <beans:property name="authenticationSuccessHandler" ref="successHandler"/>
    <beans:property name="usernameParameter" value="hdnUserName" />
    <beans:property name="passwordParameter" value="password" />
</beans:bean>
<beans:bean id="successHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <beans:property name="defaultTargetUrl" value="/user/dashboard.jsp"/>
</beans:bean>
<beans:bean id="failureHandler" class="com.vitrana.hilit.web.security.UserNameCachingAuthenticationFailureHandler">
    <beans:property name="defaultFailureUrl" value="/login?error"/>
</beans:bean>
<beans:bean id="customLogoutSuccessHandler" class="com.vitrana.hilit.web.security.CustomLogoutSuccessHandler" > </beans:bean>

<beans:bean class="com.vitrana.hilit.web.security.SessionDestroyedListener">
</beans:bean>

请提出建议。任何帮助表示赞赏。 谢谢

【问题讨论】:

你可以在这里找到你的解决方案***.com/questions/7391735/… 我已经尝试了所有这些。没用。我无法添加过滤器=无,因为我在页面上使用安全标记库和 csrf。请提出其他解决方案。 您是否尝试从 &lt;security:logout&gt; 元素中删除 invalidate-session="true" @jlumietu 不。它没有做任何事情。问题正在发生,因为我必须授予登录匿名访问权限才能使 csrf 保护工作 你找到解决办法了吗? 【参考方案1】:

为不需要授权的端点禁用spring web security。比如登录页面静态内容等。一旦你禁用 spring security 将不会验证会话。

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter 
    @Override
    public void configure(WebSecurity webSecurity) 
        log.debug("ignore urls for web security.....");
        //Web resources
        webSecurity.ignoring().antMatchers("/uistatic/**");
        webSecurity.ignoring().antMatchers("/css/**");
        webSecurity.ignoring().antMatchers("/js/**");
        webSecurity.ignoring().antMatchers("/img/**");
        webSecurity.ignoring().antMatchers("/images/**");
        webSecurity.ignoring().antMatchers("/index**");
        webSecurity.ignoring().antMatchers("/login**");
    

【讨论】:

以上是关于Spring security:注销时始终重定向到 invalid-session-url的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:成功注销时重定向到 invalid-session-url 而不是 logout-success-url

Spring security - 禁用注销重定向

防止 Spring Security 在登录/注销后进行 302 重定向

使用 Spring Security 和 Grails 注销后如何将用户重定向到不同的页面

java spring boot / spring security(HttpSecurity)中的会话到期时如何自动注销

Spring Security 自定义登录处理 URL 始终重定向到故障处理程序