当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot 2和Spring Security 5的多因素身份验证

苏彦君
2023-03-14
    null
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        // validate the OTP code
    }

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

允许添加要使用的其他AuthenticationProvider

我的securityconfig的相关部分如下所示。

    @Configuration
    @EnableWebSecurity
    @EnableJpaAuditing(auditorAwareRef = "appSecurityAuditorAware")
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        private final TokenProvider tokenProvider;

        public SecurityConfig(TokenProvider tokenProvider) {
            this.tokenProvider = tokenProvider;
        }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authenticationProvider(new MfaAuthenticationProvider());

        http.authorizeRequests()
            // Public endpoints, HTML, Assets, Error Pages and Login
            .antMatchers("/", "favicon.ico", "/asset/**", "/pages/**", "/api/auth/token").permitAll()

            // MFA auth endpoint
            .antMatchers("/api/auth/mfa-token").hasAuthority(ROLE_PRE_AUTH_MFA_REQUIRED)

            // much more config

authController注入了authenticationManagerBuilder并将其整合在一起。

@RestController
@RequestMapping(AUTH)
public class AuthController {
    private final TokenProvider tokenProvider;
    private final AuthenticationManagerBuilder authenticationManagerBuilder;

    public AuthController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) {
        this.tokenProvider = tokenProvider;
        this.authenticationManagerBuilder = authenticationManagerBuilder;
    }

    @PostMapping("/mfa-token")
    public ResponseEntity<Token> mfaToken(@Valid @RequestBody OneTimePassword oneTimePassword) {
        var username = SecurityUtils.getCurrentUserLogin().orElse("");
        var authenticationToken = new OneTimePasswordAuthenticationToken(username, oneTimePassword.getCode());
        var authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);

        // rest of class
"error": "Forbidden",
"message": "Access Denied",
"trace": "org.springframework.security.authentication.ProviderNotFoundException: No AuthenticationProvider found for de.....OneTimePasswordAuthenticationToken
No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken. 

--

注:由于这是一个关于安全的问题,我正在寻找一个可靠的和/或官方来源的答案。谢谢你。

共有1个答案

翟冷勋
2023-03-14

回答我自己的问题,这是我是如何实施的,经过进一步的研究。

我有一个提供程序作为pojo实现authenticationprovider。它故意不是bean/组件。否则Spring会将其注册为唯一的提供者。

public class MfaAuthenticationProvider implements AuthenticationProvider {
    private final AccountService accountService;

    @Override
    public Authentication authenticate(Authentication authentication) {
        // here be code 
        }

在我的SecurityConfig中,我让Spring自带AuthenticationManagerBuilder并手动注入我的MFAAuthenticationProvider

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
       private final AuthenticationManagerBuilder authenticationManagerBuilder;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // other code  
        authenticationManagerBuilder.authenticationProvider(getMfaAuthenticationProvider());
        // more code
}

// package private for testing purposes. 
MfaAuthenticationProvider getMfaAuthenticationProvider() {
    return new MfaAuthenticationProvider(accountService);
}
    var authenticationToken = new OneTimePasswordAuthenticationToken(usernameFromJwt, providedOtp);
    var authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
 类似资料:
  • 我正在寻找如何使用spring security Oauth2实现双因素身份验证(2FA)的方法。要求是用户只需要对具有敏感信息的特定应用程序进行双因素身份验证。这些webapp都有自己的客户端ID。 我脑海中浮现的一个想法是“误用”范围审批页面,迫使用户输入2FA代码/PIN(或其他)。 示例流如下所示: null null

  • 本文向大家介绍什么是双因素身份验证?相关面试题,主要包含被问及什么是双因素身份验证?时的应答技巧和注意事项,需要的朋友参考一下 双因素身份验证是在帐户登录过程中启用第二级身份验证。 因此,如果用户只需要输入用户名和密码,那么就被认为是单因素身份验证。

  • 多因素身份验证的Spring OAuth2实现的完整代码已经上载到文件共享站点,您可以通过单击此链接下载该站点。下面的说明解释了如何使用链接在任何计算机上重新创建当前问题。提供500点的赏金。 当用户试图使用Spring Boot OAuth2应用程序中的双因素身份验证(来自上一段中的链接)进行身份验证时,将触发一个错误。当应用程序应该提供第二个页面来询问用户的pin码以确认用户的身份时,错误就会

  • 我正在尝试使用一个Gem devise-two-factor在Devise上实现双因素身份验证。我想验证是在2个步骤,在第一,我将要求用户名和密码。如果用户通过了这一步,那么他将被重定向到OTP的下一页,如果2FA被激活,否则会话将由Devise验证。 如果用户选择了2fa,那么我希望使用Devise来执行所有的身份验证,而不希望在User.validate_and_consume_otp(CUR

  • 所有的, 有人能就如何使用JAAS LoginContext对多个KDC/Realm组合进行身份验证提供建议吗?换句话说,如果尝试1对领域A失败,请尝试领域B。 类似于下面的伪代码。 一如既往,任何帮助都非常感谢。 查看剪贴板打印文本?

  • 在这里,我的场景有点类似于Gmail的双因素认证。当一个用户成功登录(SMS代码发送给用户),然后用另一个页面挑战他输入SMS代码。如果用户正确地获得了SMS代码,他将被显示为安全页面(如Gmail收件箱)。