当前位置: 首页 > 知识库问答 >
问题:

为什么Spring Security会将匿名用户重定向到expiredsessionurl

卞成荫
2023-03-14
    null

这些页面配置为.authorizerequests().antmatchers(“/”、“/home”、“/about”).PermitAll().我启用了无效会话选项来处理经过身份验证的用户:.SessionManagement().invalidSessionURL(“/errors/invalidSession”)。如果我注释掉该选项,那么除了步骤#10-SessionManagementFilter看到请求的会话ID无效(#9),但没有启动新会话并执行重定向(#10)之外,上面描述的所有内容都完全相同。

为什么?我可以做什么来保留无效会话选项,但正确地处理匿名用户,即不被重定向?或者这是不可能的,我将不得不单独处理经过身份验证的用户?如果有人能帮助我理解这里发生的事情,并为我指明解决这个问题的方向,我将非常感激。如果您需要查看我的完整http配置,请告诉我。

编辑

我对匿名和注册(经过身份验证)的用户运行了一系列测试。如果启用.sessionmanagement().invalidsessionURL(“/errors/invalidsession”),那么这两种类型的用户最终都会到达错误页面。未选中RememberMe的经过身份验证的用户与anon用户相同。如果选中了RememberMe,则一旦RememberMe超时,就会出现错误页。

如果禁用invalid session选项,则不会有用户获得错误页(这是有意义的)。这两种类型的用户都可以浏览公共页面,只要他们愿意,经过身份验证的用户将被要求在会话或RememberMe过期后登录

if (invalidSessionStrategy != null) {
    invalidSessionStrategy
        .onInvalidSessionDetected(request, response);
    return;
}
if (createNewSession) {
    request.getSession();
}
redirectStrategy.sendRedirect(request, response, destinationUrl);

共有1个答案

支华池
2023-03-14

好吧,所以在过去的几周里,我一直在研究Spring Security,试图理解它是如何结合在一起的。我还在学习,但对于这种特殊的情况,我找到了两种有效的方法。

显而易见的一个方法是绕过公共页面的安全性,如下所示:

@Override
public void configure(WebSecurity web) throws Exception
{
    web
    .ignoring()
        .antMatchers("/", "/home", "/about", "/login**", "/thankyou", "/user/signup**", "/resources/**")
    ;
}

我对web安全的总体了解还不够,不知道这是否是一种可接受的方法,但它允许匿名用户浏览站点W/O而获得无效的会话错误。

authCookie.setCookie(request, response, "anonymousUser");
or
authCookie.setCookie(request, response, authentication.getName());

我目前使用实际登录只是为了测试目的--它最终只是一个简单的是/否指示器。CustomLogoutSuccessShandler将其重置为anonymousUser

无效会话方法如下所示:

@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) 
    throws IOException, ServletException {

    String url = destinationUrl;

    //reset context default value
    redirectStrategy.setContextRelative(false);

    if (authCookie.isCurrentCookieAnonymous()) {
        //pass the URL originally requested by the anonymous user
        url = request.getRequestURI();
        //the URL needs to have the context removed
        redirectStrategy.setContextRelative(true);
    }

    //always revert to anonymous user
    authCookie.setCookie(request, response, "anonymousUser");

    logger.debug("Starting new session (if required) and redirecting to '" + url + "'");

    if (createNewSession)
        request.getSession();

    redirectStrategy.sendRedirect(request, response, url);
}

同样,如果需要,我可以发布完整的课程。

@Bean
public SessionManagementBeanPostProcessor sessionManagementBeanPostProcessor() {
    return new SessionManagementBeanPostProcessor();
}

protected static class SessionManagementBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        if (bean instanceof SessionManagementFilter) {
            SessionManagementFilter filter = (SessionManagementFilter) bean;
            filter.setInvalidSessionStrategy(new RedirectInvalidSession("/errors/invalidSession"));
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        return bean;
    }
}
 类似资料:
  • 我想知道我使用匿名登录方法的应用的用户会发生什么情况。 Firebase文档非常糟糕,没有解释所有的事情,希望开发者自己去发现。我在它的旧版本文档中发现,匿名会话将根据登录中设置的到期时间到期 我找到了这个答案,但它真的是不可接受的。如果你做一个网络应用程序,让每件事都变得困难,匿名用户的数量会增长非常非常快。我甚至无法在我的仪表板中看到我的应用程序用户的数量!!!!!那么,我该怎么办?我应该自己

  • 问题内容: 我正在使用express (最新)和以下代码: POST重定向到GET,但PUT重定向到PUT。是否可以将PUT重定向到GET(与POST相同)? 问题答案: 在详细讨论之前,下面是解决问题的一种方法: 默认情况下,Express使用HTTP代码302进行重定向。根据HTTP规范,这可以防止POST / PUT请求被重定向为POST / PUT请求,并解释了您在代码中观察到的内容: 如

  • 问题内容: 就在今天,我需要一种在不同对象之间传递函数的方法。我很快了解到您不能直接在Java中做到这一点,但是您可以传递一个wht实例,该实例显然被称为“匿名内部类”,如下所示: 定义类: 使其成为一个实例: 并称之为: 很简单。但是我不明白的是为什么它被称为“匿名”。我不只是给它起名字MyCallback吗?命名的东西不能匿名,对吗?请避免对这个术语感到困惑。 问题答案: 不,您说的是MyCa

  • 我第一次在设置simpleSAMLphp服务提供商时遇到了一些麻烦。 我将服务提供商配置为: 我还配置了身份提供者,它似乎工作正常。但是,当用户从idp重定向回simpleSAMLphp时,将显示simpleSAMLphp安装页面(其中包含一些测试工具)。 我的测试使用以下代码: 当我尝试使用“测试配置的身份验证源”工具登录时,我也会返回安装首页,而不是我应该获得的属性概述。 我试图检查idp发送

  • 我不能在设置cookie后返回任何地方,cookie设置正确,但在设置cookie后,它不会重定向任何地方。 下面是我的代码: 下面是JavaScript的功能: 这是我的函数,但不重定向到索引或其他任何地方:

  • 我试图将spring oauth2(基于java的配置而不是引导)与angular 6集成, 我的WebSecurityConfigurerAdapter.java文件是: 我的身份验证提供程序是: 后端出现错误: