Spring Boot Oauth 自定义登录表单

Posted

技术标签:

【中文标题】Spring Boot Oauth 自定义登录表单【英文标题】:Spring Boot Oauth Custom Login Form 【发布时间】:2016-09-14 17:16:15 【问题描述】:

我按照春季教程“使用 OAuth2 进行 SSO:Angular JS 和 Spring Security 第 V 部分”。

在自定义登录表单不再起作用之后,我将“authserver”项目从 maven 转换为 gradle。

登录表单需要 pom.xml 中的 wro 任务吗?

我也试过这个教程,但它在我的场景中也不起作用: http://docs.spring.io/spring-security/site/docs/3.2.x/guides/form.html

我希望你能帮助我。

日志文件:

2016-05-18 11:14:53.667 DEBUG 22312 --- [nio-9999-exec-9] o.s.security.web.FilterChainProxy : /login 在附加过滤器链中的第 14 个位置;触发过滤器:'LogoutFilter' 2016-05-18 11:14:53.667 调试 22312 --- [nio-9999-exec-9] os.s.w.u.matcher.AntPathRequestMatcher:请求 'GET /login' 不匹配 'POST /logout 2016-05-18 11:14:53.667 调试 22312 --- [nio-9999-exec-9] o.s.security.web.FilterChainProxy : /login 在附加过滤器链中的第 14 个位置;触发过滤器:'UsernamePasswordAuthenticationFilter' 2016-05-18 11:14:53.667 调试 22312 --- [nio-9999-exec-9] os.s.w.u.matcher.AntPathRequestMatcher:请求 'GET /login' 与 'POST /login' 不匹配 2016-05-18 11:14:53.667 调试 22312 --- [nio-9999-exec-9] o.s.security.web.FilterChainProxy : /login 在附加过滤器链中的第 14 个位置;触发过滤器:'DefaultLoginPageGeneratingFilter' 2016-05-18 11:14:53.667 调试 22312 --- [nio-9999-exec-9] w.c.HttpSessionSecurityContextRepository:SecurityContext 为空或内容是匿名的 - 上下文不会存储在 HttpSession 中。

OAuth2ServerConfiguration中的代码:

   @Override
    public void configure(HttpSecurity http) throws Exception 
        http.formLogin().loginPage("/login").permitAll()
            .and().requestMatchers()
                .antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
            .and().authorizeRequests()
                .anyRequest().authenticated();
    

MainAuthserverApplication.java@ComponentScan @SessionAttributes("authorizationRequest") @EnableAutoConfiguration() @EnableConfigurationProperties(AuthProperties.class) public class MainAuthserverApplication extends WebMvcConfigurerAdapter

@Override
public void addViewControllers(ViewControllerRegistry registry) 
    registry.addViewController("/login").setViewName("login");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    registry.addViewController("/oauth/confirm_access").setViewName("authorize");

【问题讨论】:

【参考方案1】:

我已经自己解决了这个问题:

看来这两个方法必须在同一个类中:

@Configuration
@Order(-20)
protected static class LoginConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    protected void configure(HttpSecurity http) throws Exception 


        // @formatter:off
        http.formLogin().loginPage("/login").permitAll().and().requestMatchers()
            .antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access").and().authorizeRequests()
            .anyRequest().authenticated();
        // @formatter:on
    

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.parentAuthenticationManager(authenticationManager);
    

【讨论】:

嗨,詹斯,你能在 github 上分享你的工作吗?我做了同样的事情,但我的不工作

以上是关于Spring Boot Oauth 自定义登录表单的主要内容,如果未能解决你的问题,请参考以下文章

如何从 facebook/google/... oauth2 身份验证在 Spring (Boot) 中为单页应用程序派生自定义登录令牌?

Spring OAuth:用于验证授权端点的自定义表单

如何配置 Spring Boot 和 Spring Security 以支持表单登录和 Google OAuth2 登录

在 Spring Boot OAUTH2 中返回 RESTful/json 响应而不是登录表单

基于Spring oauth2.0统一认证登录,返回自定义用户信息

在 Spring Boot OAuth2 中跳过 OAuth 用户批准