Spring Security 5 中使用 oauth2 的自定义登录页面返回 null
Posted
技术标签:
【中文标题】Spring Security 5 中使用 oauth2 的自定义登录页面返回 null【英文标题】:Custom login page in Spring Security 5 using oauth2 returns null 【发布时间】:2018-10-31 09:26:48 【问题描述】:我正在使用oauth2
在Spring Security 5
中开发自定义登录页面。所以我有自定义设置:
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests().antMatchers("/").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login().loginPage("/login/oauth2").permitAll();
并使用@RequestMapping("/login/oauth2")
创建controller
:
@GetMapping("/")
public String index()
return "index";
@GetMapping("/login/oauth2")
public String login(Model model, OAuth2AuthenticationToken authentication)
return "login";
login.html
页面是从控制器重定向到login
方法的常规形式:
<h1>Logowanie</h1>
<a>ZALOGUJ</a>
<a class="btn" href="/login/oauth2/code/google">Login</a>
使用此配置OAuth2AuthenticationToken authentication
为空,因此无法应用身份验证。默认Spring Security 5
配置一切正常。这里描述了我所基于的示例:https://docs.spring.io/spring-security/site/docs/5.0.0.RELEASE/reference/htmlsingle/#oauth2login-advanced-login-page;部分31.1 OAuth 2.0 Login Page
。
【问题讨论】:
你在你的控制器方法中做了什么?此方法只应呈现您的自定义日志页面(您的 HTML)。为什么要将表单发送到登录页面而不是授权端点? 我不讨论官方的例子,我讨论你的控制器方法。文档说:您需要为@Controller 提供能够呈现自定义登录页面的@RequestMapping("/login/oauth2")。 好吧,也许你是对的。那么您是否能够提供某种“逻辑”应该如何完成?因为渲染我认为没什么大不了的,但是应用程序如何知道“现在”它应该被重定向到让我们说“谷歌登录页面”? 您阅读文档了吗?您必须支持指向身份验证点的链接:<a href="/oauth2/authorization/google">Google</a>
您的登录页面仅包含指向自身的链接。
您编辑的登录页面有一个指向/login/oauth2/code/google
的链接,但文档显示/oauth2/authorization/google
。
【参考方案1】:
在我的应用程序中,我必须创建我的自定义 WebMvc 配置:
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer
@Override
public void addViewControllers(ViewControllerRegistry registry)
registry.addViewController("/login").setViewName("login");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
然后在 WebSecurityConfig 中:
@Override
protected void configure(final HttpSecurity http) throws Exception
http.authorizeRequests().antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and().formLogin()
.loginPage("/login")
.permitAll()
.and().csrf().disable()
.logout().permitAll();
我认为在这种情况下您不需要自定义控制器。
我写了一篇关于隐式流中静默令牌刷新的博文,但在那里你会发现带有自定义登录页面的完整工作应用程序:
https://regulargeek.blogspot.com/2018/05/angular-5-springboot-2-oauth2-and.html
【讨论】:
以上是关于Spring Security 5 中使用 oauth2 的自定义登录页面返回 null的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 redis 使用 spring-security-oauth2 持久化令牌
带有 WSO2 身份服务器的 Spring Cloud Security
无法修复 spring-security-oauth2-resource-server 上的漏洞
如何在 spring-security 5.2 中增加 RemoteJWKSet 缓存 TTL
如何在 Spring webflux 应用程序中使用 Spring WebSessionIdResolver 和 Spring Security 5?