Spring Boot、Spring Security 指定重定向登录 url

Posted

技术标签:

【中文标题】Spring Boot、Spring Security 指定重定向登录 url【英文标题】:Spring Boot, Spring Security specify redirect login url 【发布时间】:2017-11-27 18:31:32 【问题描述】:

在我的 Spring Boot 应用程序中,我需要实现以下场景:

匿名用户访问以下页面:http://example.com/product-a.html 该用户想询问有关此产品的问题。它可以在另一个页面上完成,位于以下地址:http://example.com/product-a/ask。用户按下http://example.com/product-a.html 处的 按钮,将显示登录/注册弹出窗口。成功登录后,用户应自动重定向到http://example.com/product-a/ask(但当前使用默认的 Spring Security 实现,用户正在重定向回页面发起者http://example.com/product-a.html

如何正确使用 Spring Boot/Spring Security 实现/配置此重定向?

更新

这是我的网络安全配置:

@Override
protected void configure(HttpSecurity http) throws Exception 

    // @formatter:off
    http.addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class);

    http
        .csrf().ignoringAntMatchers("/v1.0/**", "/logout")
    .and()
        .authorizeRequests()

        .antMatchers("/oauth/authorize").authenticated()
        //Anyone can access the urls
        .antMatchers("/images/**").permitAll()
        .antMatchers("/signin/**").permitAll()
        .antMatchers("/v1.0/**").permitAll()
        .antMatchers("/auth/**").permitAll()
        .antMatchers("/actuator/health").permitAll()
        .antMatchers("/actuator/**").hasAuthority(Permission.READ_ACTUATOR_DATA)
        .antMatchers("/login").permitAll()
        .anyRequest().authenticated()
    .and()
        .formLogin()
            .loginPage("/login")
            .loginProcessingUrl("/login")
            .failureUrl("/login?error=true")
            .usernameParameter("username")
            .passwordParameter("password")
            .permitAll()
        .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl(logoutSuccessUrl)
                .permitAll();
    // @formatter:on

我为 AngularJS 客户端使用 OAuth2/JWT + 隐式流

【问题讨论】:

按下“”按钮有什么作用?它是自行弹出登录/注册,还是只是向example.com/product-a/ask 发出获取请求? @目前我只打算为“”按钮实现这个。但是我已经为其他页面实现了这两种方法(弹出页面和专用页面)。因此,在这种情况下,最好同时支持他们两个。 @zakariaamine 我已经添加了我的配置。我使用 OAuth2/JWT + Implicit Flow 为我用 AngularJS 编写的 UI 客户端 第一个猜测:你尝试添加.formLogin().defaultSuccessUrl("/product-a/ask") @zakariaamine 我认为它会起作用,但它将所有登录请求(从任何页面)重定向到提到的那个,但我必须控制用户应该被重定向到哪里,因为successUrl 将因一页而异。 【参考方案1】:

我认为你不应该使用 spring 的默认 /login 处理 url,而是在控制器中创建你自己的 /mylogin 。然后你可以在方法中注入 HttpServletRequest 并根据请求的上下文采取行动,例如:

@PostMapping("/mylogin")
public ResponseEntity<> processingLogingURL(HttpServletRequest request)
   // switch bases on the request URL after checking security off course
   switch(request.getRequestURL())

    //redirect based on the caller URL 
  


最后将您的 .loginProcessingUrl("/login") 更改为 .loginProcessingUrl("/mylogin")

【讨论】:

以上是关于Spring Boot、Spring Security 指定重定向登录 url的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security常用过滤器介绍

Grails Spring Core 安全插件 - 无法解析类

Spring security @secure 不适用于角色层次结构

Spring Boot 学习例子

Spring Boot 2Spring Boot CLI

Spring Security OAuth - 访问此资源需要完全身份验证