欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在SpringBoot中實(shí)現(xiàn)多種方式登錄(通過(guò)用戶名、手機(jī)號(hào)、郵箱等)的詳細(xì)指南

 更新時(shí)間:2024年11月26日 09:44:49   作者:繁依Fanyi  
今天,我們將跳進(jìn) Spring Boot 的世界,探索如何通過(guò) 用戶名、手機(jī)號(hào)、郵箱 等多種方式實(shí)現(xiàn)登錄,而我們要做的就是為他們提供這些選擇,確保他們都能毫無(wú)阻礙地進(jìn)入我們的系統(tǒng),感興趣的小伙伴跟著小編一起來(lái)看看吧

歡迎來(lái)到一場(chǎng)技術(shù)與幽默交織的冒險(xiǎn)!今天,我們將跳進(jìn) Spring Boot 的世界,探索如何通過(guò) 用戶名、手機(jī)號(hào)、郵箱 等多種方式實(shí)現(xiàn)登錄。想象一下,用戶在登錄時(shí)可以隨心所欲地選擇——就像你今天早上糾結(jié)到底是要喝美式咖啡還是拿鐵!而我們要做的就是為他們提供這些選擇,確保他們都能毫無(wú)阻礙地進(jìn)入我們的系統(tǒng)。

目標(biāo)? 用一種輕松而富有趣味的方式帶你構(gòu)建一個(gè)支持多種登錄方式的 Spring Boot 項(xiàng)目!好了,系好安全帶,讓我們開(kāi)始這段奇妙的代碼之旅。

一、需求分析

首先,讓我們明白我們要做什么。如果你還記得那些老式網(wǎng)站,登錄方式非常單一:只允許使用用戶名登錄,且密碼必須是8個(gè)字符的 “password123” 這種經(jīng)典組合。好吧,時(shí)代已經(jīng)不同了,現(xiàn)在的人們懶得記用戶名和密碼,他們更愿意使用手機(jī)、郵箱,甚至臉書、微信等社交賬號(hào)來(lái)登錄。為什么? 因?yàn)槊總€(gè)人都有點(diǎn)“懶得輸入太多字”的心理。

因此,我們的目標(biāo)很明確——讓用戶能有更多的選擇方式來(lái)登錄:

  • 用戶名 + 密碼(這是經(jīng)典款)
  • 手機(jī)號(hào) + 密碼(這就很潮流了)
  • 郵箱 + 密碼(一看就很高端)

這就像在餐廳點(diǎn)菜——我們提供多樣化的菜單,用戶隨便選,愛(ài)吃啥點(diǎn)啥!

二、搭建你的基礎(chǔ)工程:項(xiàng)目配置

沒(méi)有基礎(chǔ)設(shè)施的建筑就是一場(chǎng)災(zāi)難,而沒(méi)有配置文件的 Spring Boot 項(xiàng)目就是——廢的。所以,第一步,我們要確保項(xiàng)目的所有配置正確無(wú)誤。

在你的 pom.xml 文件中,加入我們即將用到的一些核心依賴。包括 Spring Security(因?yàn)槲覀円娴卿浾J(rèn)證嘛)、JPA(因?yàn)槲覀円械胤酱鎯?chǔ)用戶信息),以及 MySQL 數(shù)據(jù)庫(kù)的連接驅(qū)動(dòng)。

<dependencies>
    <!-- Spring Boot Security 依賴,用于管理我們的登錄和認(rèn)證 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    <!-- Spring Boot Data JPA 依賴,用來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <!-- Spring Boot Web 依賴,用來(lái)處理 Web 請(qǐng)求 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- MySQL Connector 依賴,畢竟數(shù)據(jù)還是要放進(jìn)數(shù)據(jù)庫(kù)的 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- Lombok 用來(lái)減少代碼量,讓我們不用再寫那些煩人的 getter/setter -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

好了,既然我們已經(jīng)有了正確的配置依賴,現(xiàn)在就像是我們已經(jīng)準(zhǔn)備好了一杯現(xiàn)磨咖啡,接下來(lái)該享受喝咖啡的過(guò)程了!

三、數(shù)據(jù)庫(kù)設(shè)計(jì):讓用戶信息有個(gè)家

每個(gè)登錄系統(tǒng)都需要一個(gè)地方存儲(chǔ)用戶信息,否則它就像你早上出門忘了帶鑰匙一樣尷尬。我們要?jiǎng)?chuàng)建一個(gè)用戶表來(lái)保存用戶名、手機(jī)號(hào)、郵箱以及密碼。這里我們使用 JPA 來(lái)簡(jiǎn)化數(shù)據(jù)庫(kù)操作,不必再寫那些瑣碎的 SQL 語(yǔ)句。

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

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

    private String username;      // 用戶名
    private String password;      // 密碼(重要的東西,當(dāng)然要加密保存)
    private String email;         // 郵箱
    private String phoneNumber;   // 手機(jī)號(hào)
}

你可能會(huì)問(wèn),為什么不加個(gè)字段來(lái)存儲(chǔ)用戶的昵稱、性別、興趣愛(ài)好?嗯,那確實(shí)也是個(gè)不錯(cuò)的想法,但我們今天的重點(diǎn)是登錄系統(tǒng)——所以先忍一忍,別跑偏了。

四、用戶存儲(chǔ)庫(kù):我們需要一些查詢方式

數(shù)據(jù)庫(kù)表已經(jīng)有了,但我們還需要寫一些代碼來(lái)查詢這些用戶信息。為此,我們需要?jiǎng)?chuàng)建一個(gè)存儲(chǔ)庫(kù)類,用于根據(jù)用戶名、手機(jī)號(hào)或者郵箱來(lái)查找用戶。

public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByUsername(String username);

    Optional<User> findByEmail(String email);

    Optional<User> findByPhoneNumber(String phoneNumber);
}

瞧,這就是我們數(shù)據(jù)層的三劍客:findByUsernamefindByEmail 和 findByPhoneNumber。有了它們,我們可以方便地從數(shù)據(jù)庫(kù)中查詢到用戶。

五、用戶認(rèn)證服務(wù):讓 Spring Security 成為我們的好幫手

接下來(lái),我們要告訴 Spring Security 如何根據(jù)不同的登錄信息來(lái)加載用戶。這部分代碼就像是一道考題,告訴系統(tǒng):“嘿,如果用戶輸入了個(gè)手機(jī)號(hào)或者郵箱,你該如何處理?”

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

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

        // 判斷輸入的登錄信息類型,來(lái)確定是郵箱、手機(jī)號(hào)還是用戶名
        if (loginInput.contains("@")) {
            // 郵箱登錄
            userOpt = userRepository.findByEmail(loginInput);
        } else if (loginInput.matches("\\d+")) {
            // 手機(jī)號(hào)登錄
            userOpt = userRepository.findByPhoneNumber(loginInput);
        } else {
            // 用戶名登錄
            userOpt = userRepository.findByUsername(loginInput);
        }

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

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

這個(gè)類做的事情就像是一個(gè)門衛(wèi),不管用戶輸入的是用戶名、郵箱,還是手機(jī)號(hào),都會(huì)驗(yàn)證一遍,確保用戶是真實(shí)存在的。

六、密碼加密:不要讓用戶的密碼變成人人可知的小秘密

安全問(wèn)題非常重要,如果我們把密碼明文存儲(chǔ),那就相當(dāng)于把家里的鑰匙放在門口的地墊下面,絕對(duì)是個(gè)壞主意。幸運(yùn)的是,Spring Security 自帶了密碼加密支持,我們可以使用 BCryptPasswordEncoder 來(lái)加密用戶密碼。

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

然后在用戶注冊(cè)時(shí),對(duì)密碼進(jìn)行加密后再存入數(shù)據(jù)庫(kù):

@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);
    }
}

有了這個(gè)小魔法,所有密碼都會(huì)以加密形式存儲(chǔ),即便有人黑進(jìn)了數(shù)據(jù)庫(kù),也只能看到一串毫無(wú)意義的字符。

七、Spring Security 配置:別忘了這位主角

一部電影怎么能沒(méi)有導(dǎo)演?而我們的導(dǎo)演就是 Spring Security 的配置類。我們將在這里配置登錄邏輯,告訴系統(tǒng)如何處理不同的登錄方式。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 配置認(rèn)證方式,使用我們自定義的 UserDetailsService 和密碼加密方式
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 設(shè)置允許哪些 URL 可以被匿名訪問(wèn)
        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/login", "/register").permitAll()  // 允許登錄和注冊(cè)頁(yè)面被訪問(wèn)
            .anyRequest().authenticated()  // 其他頁(yè)面都需要認(rèn)證
            .and()
            .formLogin()
            .loginPage("/login")  // 設(shè)置自定義的登錄頁(yè)面
            .defaultSuccessUrl("/home", true)  // 登錄成功后跳轉(zhuǎn)的頁(yè)面
            .permitAll()
            .and()
            .logout()
            .permitAll();


    }
}

在這段配置中,我們告訴 Spring Security 使用我們自定義的 CustomUserDetailsService 來(lái)處理登錄請(qǐng)求。我們還設(shè)置了登錄頁(yè)面和成功后的重定向頁(yè)面,顯得很專業(yè)有木有?

八、最后的話:為用戶提供選擇,登錄就像選咖啡一樣簡(jiǎn)單

現(xiàn)在,我們已經(jīng)成功搭建了一個(gè)支持多種方式登錄的系統(tǒng)。不論是使用用戶名、手機(jī)號(hào)還是郵箱,用戶都可以自由選擇,就像他們?cè)绯窟x擇喝哪種咖啡一樣簡(jiǎn)單。而你,作為這家“咖啡店”的老板,成功地提供了更多的便利和選擇!

所以,下次當(dāng)你看到用戶輕松登錄時(shí),可以驕傲地拍拍自己的肩膀,畢竟,你讓這個(gè)世界的登錄系統(tǒng)變得更加多樣化了。

以上就是在SpringBoot中實(shí)現(xiàn)多種方式登錄(通過(guò)用戶名、手機(jī)號(hào)、郵箱等)的詳細(xì)指南的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot多種方式登錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)二維碼生成功能詳細(xì)示例

    java實(shí)現(xiàn)二維碼生成功能詳細(xì)示例

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)二維碼生成功能的相關(guān)資料,隨著信息化時(shí)代的到來(lái),二維碼作為一種信息傳遞的工具,越來(lái)越受到人們的歡迎,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java Spring-Cache key配置注意事項(xiàng)介紹

    Java Spring-Cache key配置注意事項(xiàng)介紹

    本文主要對(duì)java spring-cache key配置注意事項(xiàng)進(jìn)行了介紹,小編覺(jué)得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究

    Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究

    這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • SpringBoot注解@EnableScheduling定時(shí)任務(wù)詳細(xì)解析

    SpringBoot注解@EnableScheduling定時(shí)任務(wù)詳細(xì)解析

    這篇文章主要介紹了SpringBoot注解@EnableScheduling定時(shí)任務(wù)詳細(xì)解析,@EnableScheduling 開(kāi)啟對(duì)定時(shí)任務(wù)的支持,啟動(dòng)類里面使用@EnableScheduling 注解開(kāi)啟功能,自動(dòng)掃描,需要的朋友可以參考下
    2024-01-01
  • Java通過(guò)導(dǎo)出超大Excel文件解決內(nèi)存溢出問(wèn)題

    Java通過(guò)導(dǎo)出超大Excel文件解決內(nèi)存溢出問(wèn)題

    導(dǎo)出excel是咱Java開(kāi)發(fā)的必備技能,下面這篇文章主要給大家介紹了關(guān)于Java通過(guò)導(dǎo)出超大Excel文件解決內(nèi)存溢出問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java設(shè)計(jì)模式中的抽象工廠模式解讀

    Java設(shè)計(jì)模式中的抽象工廠模式解讀

    這篇文章主要介紹了Java設(shè)計(jì)模式中的抽象工廠模式解讀,抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無(wú)需指定他們的具體類,需要的朋友可以參考下
    2023-11-11
  • Spring security自定義用戶認(rèn)證流程詳解

    Spring security自定義用戶認(rèn)證流程詳解

    這篇文章主要介紹了Spring security自定義用戶認(rèn)證流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式

    mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式

    本文主要介紹了mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java的枚舉enum示例詳解

    Java的枚舉enum示例詳解

    這篇文章主要給大家介紹了關(guān)于Java的枚舉enum的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 使用IDEA開(kāi)發(fā)配置Java Web的初始化過(guò)程

    使用IDEA開(kāi)發(fā)配置Java Web的初始化過(guò)程

    該教程使用idea開(kāi)發(fā)工具初始化javaweb項(xiàng)目,該運(yùn)行在tomcat服務(wù)器上通過(guò)配置項(xiàng)目環(huán)境變量保證tomcat正常啟動(dòng),具體操作配置教程參考下本文
    2021-06-06

最新評(píng)論