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

重定向到无状态会话的原始URL

戚宏浚
2023-03-14

我正在尝试创建无状态安全性,从而将JWT令牌存储在Cookie而不是SESSION中。

问题是,如果没有会话,SavedRequestAwareAuthenticationSuccessHandler就不知道原始请求(在身份验证页面弹出之前)。所以在第77行这里savedRequest是空的。

这看起来很奇怪,我想我做错了什么。如何允许页面重定向到登录无状态会话后请求的原始URL?

>

  • 我禁用会话

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    
           ....formLogin().loginPage("/login").permitAll().successHandler(authenticationSuccessHandler)
    
        }
    

    然后,我创建了一个自定义的AuthenticationSuccessHandler,它扩展了SavedRequestStataWareAuthenticationSuccessHandler。我将其注册为successHandler(上图)。

     @Component
     public class JwtCookieAuthenticationSuccessHandler extends 
              SavedRequestAwareAuthenticationSuccessHandler {
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
                throws IOException, ServletException {
    
            Cookie cookie = ... CREATE A COOKIE WITH A JWT
    
            response.addCookie(cookie);
    
            super.onAuthenticationSuccess(request, response, authentication);
        }
    
    }
    

    编辑:这是我的依赖项:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>
    </dependencies>
    
  • 共有1个答案

    樊宏邈
    2023-03-14

    在配置中,添加:

    .requestCache().requestCache(new CookieRequestCache())
    

    完整示例:

       protected void configure(HttpSecurity http) throws Exception {
            http
                    .csrf().csrfTokenRepository(new CookieCsrfTokenRepository())
                    .and()
                    .authorizeRequests()
                    .antMatchers("/about").permitAll()
                    .antMatchers("/accounts").hasRole("ADMINISTRATOR")
                    .anyRequest().authenticated()
                    .and()
                    .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .and()
                    .requestCache().requestCache(new CookieRequestCache())
                    .and()
                    .logout()
                    .permitAll()
                    .and()
                    .sessionManagement()
                    .maximumSessions(1)
                    .sessionRegistry(sessionRegistry())
                    .and()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .securityContext()
                    .securityContextRepository(securityContextRepository);
    
     类似资料:
    • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

    • Drools中无状态会话和有状态会话的区别是什么。我浏览了不同的文件,发现下面 无状态会话执行规则时事实的任何更改都不会被规则引擎察觉,因此如果任何规则被修改,则不会发生其他规则的重新激活。 我试图执行下面的规则,发现了相同的结果

    • 我在spring Boot1.2.3 web应用程序中使用spring security 4.0.1(也使用Spring-Session1.0.1,但这与本案无关)。 每当登录的用户会话过期时,Spring就会检测到无效的会话,并将用户重定向到“.invalidsessionURL(”/session/error/invalid“)” 然而,我只想被重定向,如果目标链接在私人区域内,也不是公共区域

    • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

    • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

    • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该