java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot多种方式登录

在SpringBoot中实现多种方式登录(通过用户名、手机号、邮箱等)的详细指南

作者:繁依Fanyi

今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录,而我们要做的就是为他们提供这些选择,确保他们都能毫无阻碍地进入我们的系统,感兴趣的小伙伴跟着小编一起来看看吧

欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁!而我们要做的就是为他们提供这些选择,确保他们都能毫无阻碍地进入我们的系统。

目标? 用一种轻松而富有趣味的方式带你构建一个支持多种登录方式的 Spring Boot 项目!好了,系好安全带,让我们开始这段奇妙的代码之旅。

一、需求分析

首先,让我们明白我们要做什么。如果你还记得那些老式网站,登录方式非常单一:只允许使用用户名登录,且密码必须是8个字符的 “password123” 这种经典组合。好吧,时代已经不同了,现在的人们懒得记用户名和密码,他们更愿意使用手机、邮箱,甚至脸书、微信等社交账号来登录。为什么? 因为每个人都有点“懒得输入太多字”的心理。

因此,我们的目标很明确——让用户能有更多的选择方式来登录:

这就像在餐厅点菜——我们提供多样化的菜单,用户随便选,爱吃啥点啥!

二、搭建你的基础工程:项目配置

没有基础设施的建筑就是一场灾难,而没有配置文件的 Spring Boot 项目就是——废的。所以,第一步,我们要确保项目的所有配置正确无误。

在你的 pom.xml 文件中,加入我们即将用到的一些核心依赖。包括 Spring Security(因为我们要玩登录认证嘛)、JPA(因为我们要有地方存储用户信息),以及 MySQL 数据库的连接驱动。

<dependencies>
    <!-- Spring Boot Security 依赖,用于管理我们的登录和认证 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    <!-- Spring Boot Data JPA 依赖,用来进行数据库操作 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <!-- Spring Boot Web 依赖,用来处理 Web 请求 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- MySQL Connector 依赖,毕竟数据还是要放进数据库的 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- Lombok 用来减少代码量,让我们不用再写那些烦人的 getter/setter -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

好了,既然我们已经有了正确的配置依赖,现在就像是我们已经准备好了一杯现磨咖啡,接下来该享受喝咖啡的过程了!

三、数据库设计:让用户信息有个家

每个登录系统都需要一个地方存储用户信息,否则它就像你早上出门忘了带钥匙一样尴尬。我们要创建一个用户表来保存用户名、手机号、邮箱以及密码。这里我们使用 JPA 来简化数据库操作,不必再写那些琐碎的 SQL 语句。

@Entity
@Table(name = "users")
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;      // 用户名
    private String password;      // 密码(重要的东西,当然要加密保存)
    private String email;         // 邮箱
    private String phoneNumber;   // 手机号
}

你可能会问,为什么不加个字段来存储用户的昵称、性别、兴趣爱好?嗯,那确实也是个不错的想法,但我们今天的重点是登录系统——所以先忍一忍,别跑偏了。

四、用户存储库:我们需要一些查询方式

数据库表已经有了,但我们还需要写一些代码来查询这些用户信息。为此,我们需要创建一个存储库类,用于根据用户名、手机号或者邮箱来查找用户。

public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByUsername(String username);

    Optional<User> findByEmail(String email);

    Optional<User> findByPhoneNumber(String phoneNumber);
}

瞧,这就是我们数据层的三剑客:findByUsernamefindByEmail 和 findByPhoneNumber。有了它们,我们可以方便地从数据库中查询到用户。

五、用户认证服务:让 Spring Security 成为我们的好帮手

接下来,我们要告诉 Spring Security 如何根据不同的登录信息来加载用户。这部分代码就像是一道考题,告诉系统:“嘿,如果用户输入了个手机号或者邮箱,你该如何处理?”

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String loginInput) throws UsernameNotFoundException {
        Optional<User> userOpt;

        // 判断输入的登录信息类型,来确定是邮箱、手机号还是用户名
        if (loginInput.contains("@")) {
            // 邮箱登录
            userOpt = userRepository.findByEmail(loginInput);
        } else if (loginInput.matches("\\d+")) {
            // 手机号登录
            userOpt = userRepository.findByPhoneNumber(loginInput);
        } else {
            // 用户名登录
            userOpt = userRepository.findByUsername(loginInput);
        }

        // 如果用户不存在,抛出异常
        User user = userOpt.orElseThrow(() -> new UsernameNotFoundException("用户不存在"));

        // 返回 Spring Security 所需的 UserDetails 对象
        return new org.springframework.security.core.userdetails.User(
                user.getUsername(), 
                user.getPassword(), 
                new ArrayList<>()
        );
    }
}

这个类做的事情就像是一个门卫,不管用户输入的是用户名、邮箱,还是手机号,都会验证一遍,确保用户是真实存在的。

六、密码加密:不要让用户的密码变成人人可知的小秘密

安全问题非常重要,如果我们把密码明文存储,那就相当于把家里的钥匙放在门口的地垫下面,绝对是个坏主意。幸运的是,Spring Security 自带了密码加密支持,我们可以使用 BCryptPasswordEncoder 来加密用户密码。

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

然后在用户注册时,对密码进行加密后再存入数据库:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private PasswordEncoder passwordEncoder;

    public void registerUser(User user) {
        // 密码加密
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        userRepository.save(user);
    }
}

有了这个小魔法,所有密码都会以加密形式存储,即便有人黑进了数据库,也只能看到一串毫无意义的字符。

七、Spring Security 配置:别忘了这位主角

一部电影怎么能没有导演?而我们的导演就是 Spring Security 的配置类。我们将在这里配置登录逻辑,告诉系统如何处理不同的登录方式。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 配置认证方式,使用我们自定义的 UserDetailsService 和密码加密方式
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 设置允许哪些 URL 可以被匿名访问
        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/login", "/register").permitAll()  // 允许登录和注册页面被访问
            .anyRequest().authenticated()  // 其他页面都需要认证
            .and()
            .formLogin()
            .loginPage("/login")  // 设置自定义的登录页面
            .defaultSuccessUrl("/home", true)  // 登录成功后跳转的页面
            .permitAll()
            .and()
            .logout()
            .permitAll();


    }
}

在这段配置中,我们告诉 Spring Security 使用我们自定义的 CustomUserDetailsService 来处理登录请求。我们还设置了登录页面和成功后的重定向页面,显得很专业有木有?

八、最后的话:为用户提供选择,登录就像选咖啡一样简单

现在,我们已经成功搭建了一个支持多种方式登录的系统。不论是使用用户名、手机号还是邮箱,用户都可以自由选择,就像他们早晨选择喝哪种咖啡一样简单。而你,作为这家“咖啡店”的老板,成功地提供了更多的便利和选择!

所以,下次当你看到用户轻松登录时,可以骄傲地拍拍自己的肩膀,毕竟,你让这个世界的登录系统变得更加多样化了。

以上就是在SpringBoot中实现多种方式登录(通过用户名、手机号、邮箱等)的详细指南的详细内容,更多关于SpringBoot多种方式登录的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文