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的主要内容,如果未能解决你的问题,请参考以下文章
Grails Spring Core 安全插件 - 无法解析类