如何在自定义表单spring boot上包含多个身份验证方法(默认userdetailsservice、oauth2 google login)?

cnwbcb6i  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(177)

问题

我正在尝试用springboot构建一个登录页后端,它允许使用存储在数据库中的凭据(使用userdetails/userdetailsservice)进行身份验证,并使用google帐户构建oauth2,本质上是这样的后端(https://prnt.sc/11krtsi). 我面临的问题是,我无法创建像自定义页面这样的东西,该页面在某些路径(如/login)上封装这两种身份验证方法。我最多只能在同一个页面上同时使用默认的spring表单和默认的oauth输入(照片:https://prnt.sc/11kt2fw ; https://prnt.sc/11ktdci )但它们也有问题,比如在两个不同的地方显示警报。后端部分工作得很好,从这个意义上说,我可以登录这两个只有默认的spring表单。

我要做的是

我想创建一个与spring boot后端绑定的小型自定义表单,它允许类似的功能(检查凭据,在发送错误凭据或禁用用户或注销时显示警报),但外观不同(因此类似于:https://prnt.sc/11krtsi).
另外,我希望登录页面位于不同的端点(类似于api/v1/login)。

我试过的。

-我曾尝试创建一个由Map到api/v1/login的控制器绘制的新视图,并从安全配置中删除登录表单,但正如预期的那样,它破坏了登录验证部分,因为我无法更改配置中的端点。我以前想过让userdetailsservice登录到api/v1/login/auth,google auth登录到/api/v1/login/googleauth,重定向到给定的googleapi链接。
-我还尝试为userdetailsservice login.formlogin()创建一个自定义的登录表单,而不是链接它.oauth2login(),但是我的oauth输入没有显示出来(.formlogin()的样式和显示非常完美,登录验证凭证正确,显示通知等)。

我有问题

如何在渲染视图上使用多个登录方法(https://prnt.sc/11krtsi)有什么好办法?
(x/y)如何将.formlogin()更改为在自定义终结点上可用,并将ouath2更改为另一个终结点,以便从具有指向两个终结点的链接的公共窗体重定向?
此时,我的websecurityconfig(只提供一个带有默认表单(formlogin,oauth2)的/login页面)如下所示:

@Configuration
@AllArgsConstructor
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  private final UserService userService;
    private final BCryptPasswordEncoder bCryptPasswordEncoder;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/api/v*/**", "/css/**")
                .permitAll()
                .anyRequest().permitAll()
                .and()
                .oauth2Login().defaultSuccessUrl("/api/v1/index")
                .and()
                .formLogin().defaultSuccessUrl("/api/v1/index")
                .and()
                .logout()
                .invalidateHttpSession(true)
                .clearAuthentication(true);

    }

   @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(daoAuthenticationProvider());
    }

    @Bean
    public DaoAuthenticationProvider daoAuthenticationProvider(){
        DaoAuthenticationProvider provider =
                new DaoAuthenticationProvider();

        provider.setPasswordEncoder(bCryptPasswordEncoder);
        provider.setUserDetailsService(userService);

        return provider;
    }
}

还有一件事可能是重要的是,我需要集成这个后端部分与前端完成的Angular 。我正在尝试创建这个自定义表单,以便我知道当我需要将我们的Spring Boot后端部分与前端集成时需要做什么。
非常感谢您抽出时间阅读我的问题。任何形式的反馈都非常感谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题