java—spring security中的多个自定义身份验证提供程序

nx7onnlm  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(198)

我需要实现多重身份验证
通过otp登录
通过用户名/密码登录
通过限时登录链接登录
我怎么能做到呢。有不同的页面。通过用户名/密码登录是很容易实现的,因为它与springsecurity是开箱即用的。
我需要通过otp实现登录。我找不到正确的方法来实施它。
我试过跟踪

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException {

        String phone = authentication.getName();
        String otp = authentication.getCredentials().toString();

        if (shouldAuthenticateAgainstThirdPartySystem(username, password)) {

            // use the credentials
            // and authenticate against the third-party system
            return new UsernamePasswordAuthenticationToken(
              phone, otp, new ArrayList<>());
        } else {
            return null;
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(
          UsernamePasswordAuthenticationToken.class);
    }
}

在安全配置中

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
//    @Autowired
//    private BCryptPasswordEncoder bCryptPasswordEncoder;
    @Autowired
    private MyUserDetailsService userDetailsService;
    private static final String[] PUBLIC_MATCHERS = {  "/", "/vendor/**"  };
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder authenticationMgr) throws Exception {
        authenticationMgr.inMemoryAuthentication()
                .withUser("user").password("user").authorities("ADMIN")
                .and()
                .withUser("admin").password("admin").authorities("USER","ADMIN");
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(userDetailsService)
                .passwordEncoder(passwordEncoder());

    }
    }

登录url为“/login”
而处理通过otp登录将是:“/login via otp”
通过链接登录也有类似的不同
但我不知道如何实现同样的事情。
它是一种多身份验证提供者,但一次只能使用其中一个。

暂无答案!

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

相关问题