如何在春季安全中通过电子邮件而不是用户名登录

2022-09-05 00:22:13

我使用弹簧安全。有没有办法在Spring安全中使用电子邮件而不是用户名登录?


答案 1

您需要在登录表单中使用“电子邮件”参数

<input type="email" name="email">

然后让你的自定义WebSecurityConfigurerAdapter知道“电子邮件”现在是一个主要参数。

protected void configure(HttpSecurity http) throws Exception {
         http
            .formLogin()
            .loginPage("/login")
            .usernameParameter("email")
            .permitAll()
        .and()
            .logout()
            .permitAll();
}

最后,在 UserDetailsService 实现中覆盖 loadUserByUsername()

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    User user = userRepo.findByEmail(email);

    if (user == null) {
        throw new UsernameNotFoundException("Not found!");
    }

    return user;
}

答案 2

最简单的方法就是将其视为 .emailusername

在许多情况下,电子邮件包含您的用户名。例如:。在这封电子邮件中,是您的用户名。abc@gmail.comabc

因此,您只需要让用户直接输入电子邮件即可。

您唯一需要更新的是更改查询SQL,如下所示:

更改(按用户名查询):

SELECT username,password FROM users WHERE username=#{username}

收件人(通过电子邮件查询)

SELECT email AS username,password FROM users WHERE email=#{username}

推荐