如何创建登录但使用用户名或电子邮件和密码

克里斯

我已经使用用户名和密码创建了一个登录名,但还想添加一个电子邮件。因此,您可以使用电子邮件和密码或用户名和密码作为登录名,任何建议都会有所帮助。

我的模特

    public class Customer {
    
        @Id
        private String id;
        private String username;
        private email;
        @Size(max = 120)
        private String password;
//Constructor with getters and setters

我的身份验证控制器,它读取您的用户名和加密密码

@PostMapping("/signin")
    public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {

        //Gets username/password form login request authenticateManager then auth login account
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));

        //Update Security context using auth object
        SecurityContextHolder.getContext().setAuthentication(authentication);
        //Generate web token
        String jwt = jwtUtils.generateJwtToken(authentication);
        //Get userDetails from auth obj
        UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
        //response contains JWT and UserDetails data

        return ResponseEntity.ok(new JwtResponse(jwt,
                userDetails.getId(),
                userDetails.getUsername(),
                userDetails.getEmail(),
));
}

我的登录请求模型

 private String username;
 private String password;
//getters and setters

我的安全配置(我应该在代码中添加一个 OR 来表示电子邮件或用户名,如果是这样,我应该在哪里做这样的事情)

@Configuration
@EnableWebSecurity //apply security class
@EnableGlobalMethodSecurity(    //provides AOP security on methods/ Global AuthManager

prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    UserDetailsServiceImpl userDetailsService;

    @Autowired
    private AuthEntryPointJwt unauthorizedHandler;

    //Adding custom user details service
    @Override
    public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    //validates userNamePasswordAuthenticationToken/overriding authBean
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {  //throws exception if input is invalid
        return super.authenticationManagerBean();
    }

    //Encrypt my password
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    //provides HttpSecurity configures cors, csrf, session management
    //protected api's
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
            .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
            .authorizeRequests().antMatchers("/api/auth/**").permitAll()
                .antMatchers("/**").permitAll()

            .anyRequest().authenticated();

    }
}
马库斯·赫特·达·科雷吉奥

您应该在您的 中实现此逻辑UserDetailsService#loadByUsername,其中username可能是实际的用户名或电子邮件。

所以,你UserDetailsService看起来像这样:

public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private CustomerRepository customerRepository;

    public UserDetails loadByUsername(String username) throws UsernameNotFoundException {
        Optional<Customer> customer = this.customerRepository.findByUsernameOrEmail(username); // username can be both
        return customer.map(...mapToMyCustomUserDetails()).orElseThrow(...);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Firebase中使用用户名,电子邮件和密码创建新用户?

Firebase-如何仅使用用户名(不输入密码/电子邮件)实施登录?

如何创建一个会话,当一个人使用电子邮件和密码登录时显示用户的用户名

如何在 Django 中使用 postgres 数据库使用(用户名、电子邮件、密码、年龄和性别)创建登录和注册表单?

创建用户时如何实时通过电子邮件和密码添加用户名?

如何允许用户使用php中的用户名和电子邮件登录?

通过虚拟主机发送电子邮件,而无需使用用户名和密码

使用用户名或电子邮件使用codeigniter登录

使用节点使用用户名或电子邮件登录并做出反应

Tomcat安全容器,允许使用用户名或电子邮件地址登录

使用用户名或电子邮件地址登录Spring Boot Webflux

使用用户名或电子邮件地址登录

在Laravel 5.4中允许使用用户名或电子邮件登录

使用用户名或电子邮件登录流明护照

Laravel-使用用户名,电子邮件或电话登录

使用用户名(不是电子邮件)登录 Firebase

使用电子邮件而不是用户名登录

Flutter和Firebase-如何仅使用用户名和密码登录

Laravel 5 使用 Attempt 方法使用用户名或电子邮件自定义登录

ASP.NET Identity 注册新用户以使用用户名作为用户名而不是电子邮件,但仍不显示登录者

使用没有用户名和密码的 SMTP 发送电子邮件

ASP.NET Identity 2电子邮件和用户名的分隔,并使用电子邮件登录

有什么方法可以使用用户名或电子邮件登录Django管理界面?

如何允许客户端使用用户名和密码登录Samba共享?

如何检查电子邮件和用户名

如何在MVC身份中使用“用户名”而不是“电子邮件”登录?

ASP.NET Core:如何使用“用户名”而不是“电子邮件”登录?

如何使用 SESSION 检索登录的用户名、电子邮件?到网站

如何使用用户名和密码连接LDAP?