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 【问题描述】:

我正在使用oauth2Spring 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")。 好吧,也许你是对的。那么您是否能够提供某种“逻辑”应该如何完成?因为渲染我认为没什么大不了的,但是应用程序如何知道“现在”它应该被重定向到让我们说“谷歌登录页面”? 您阅读文档了吗?您必须支持指向身份验证点的链接:&lt;a href="/oauth2/authorization/google"&gt;Google&lt;/a&gt; 您的登录页面仅包含指向自身的链接。 您编辑的登录页面有一个指向/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 上的漏洞

带有Angularjs注销错误的Spring Boot

如何在 spring-security 5.2 中增加 RemoteJWKSet 缓存 TTL

如何在 Spring webflux 应用程序中使用 Spring WebSessionIdResolver 和 Spring Security 5?