溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring security 02中怎么自定義用戶登錄頁面和登錄處理邏輯

發(fā)布時(shí)間:2021-08-03 14:00:20 來源:億速云 閱讀:142 作者:Leah 欄目:大數(shù)據(jù)

Spring security 02中怎么自定義用戶登錄頁面和登錄處理邏輯,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

Spring security 系列博客目錄

  • Spring Security 01- 將 Spring security 引入到工程

  • Spring security 02-自定義用戶登錄頁面和登錄處理邏輯

  • Spring security 03-自定義登錄成功后的處理邏輯

  • Spring security 04-整合 jwt

對(duì)應(yīng)源代碼

  • Spring Security 01- 將 Spring security 引入到工程

  • Spring security 02-自定義用戶登錄頁面和登錄處理邏輯

  • Spring security 03-自定義登錄成功后的處理邏輯

  • Spring security 04-整合 jwt

開篇

上一篇(在項(xiàng)目里面引入spring-security會(huì)發(fā)生什么)我們將 Spring-seccurity 引入到了我們的spring-boot工程中,沒有做多余的配置,spring-security 就已經(jīng)默認(rèn)幫我們配置了一個(gè)攔截器,應(yīng)用啟動(dòng)后,當(dāng)我們?cè)L問應(yīng)用提供的資源時(shí),都會(huì)跳轉(zhuǎn)到 security 為我們提供的一個(gè)默認(rèn)登陸頁,當(dāng)我們輸入security為我們提供的用戶名和密碼,登陸成功后,就可以獲取我們需要的資源。那么問題來了!我們?nèi)绾巫远x自己的登錄頁面,以及使用我們自己的用戶信息去登錄呢?

實(shí)戰(zhàn)

創(chuàng)建工程

為了不影響之前的版本,我們這里新建一個(gè)模塊 spring-security-02,之前的版本是spring-security-01. https://github.com/nimo10050/spring-security-sample/tree/master/spring-security-02

引入依賴

依賴跟上個(gè)版本一樣,如下:

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

	</dependencies>

新建 SpringSecurity 配置類

既然我們需要自定義一些東西,只能通過額外配置的方式來實(shí)現(xiàn)。所以這里引入了spring-security的配置類

  • 添加 @Component注解

  • 添加 Spring-security 的注解 EnableWebSecurity 標(biāo)記這是 security的 配置類

  • 繼承 WebSecurityConfigurerAdapter 重寫它的配置方法

  • 重寫 configure(HttpSecurity http) 方法是為了定義登陸頁

  • 重寫 configure(AuthenticationManagerBuilder auth) 是為了定義登錄邏輯

      package com.example.demo.config;
    
      import com.example.demo.config.service.UserDetailServiceImpl;
      import org.springframework.context.annotation.Bean;
      import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
      import org.springframework.security.config.annotation.web.builders.HttpSecurity;
      import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
      import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
      import org.springframework.security.core.userdetails.UserDetailsService;
      import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
      import org.springframework.security.crypto.password.PasswordEncoder;
      import org.springframework.stereotype.Component;
    
      [@Component](https://my.oschina.net/u/3907912)
      @EnableWebSecurity
      public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
      [@Override](https://my.oschina.net/u/1162528)
      protected void configure(HttpSecurity http) throws Exception {
    
      	http.csrf().disable();// 必須有, 不然會(huì) 403 forbidden
    
      	http.formLogin()
      			.loginPage("/loginPage.html")// 自定義登錄頁
      			.loginProcessingUrl("/form/login");// 自定義登錄 action, 名字隨便起
      			// passwordParameter("password") 配置 form 表單 密碼的 name 屬性值
      			// usernameParameter("username") 配置 form 表單 用戶名的 name 屬性值
    
      	// 訪問 "/form/login", "/loginPage.html"   放行
      	http.authorizeRequests().antMatchers("/form/login", "/loginPage.html").permitAll()
      			.anyRequest().authenticated();
      }
    
      /**
       * 配置 用戶登錄處理類
       *
       * [@param](https://my.oschina.net/u/2303379) auth
       * @throws Exception
       */
      @Override
      protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      	/* 將用戶信息存儲(chǔ)到內(nèi)存中
      	   實(shí)際上不會(huì)這樣做,了解下即可
      	auth.inMemoryAuthentication()
      			.withUser("zhangsan")
      			.password(passwordEncoder().encode("123456"))
      			.authorities("admin");*/
    
      	auth.userDetailsService(userDetailsService());
      }
    
      /**
       * 自定義登錄處理
       *
       * @return
       */
      @Bean
      public UserDetailsService userDetailsService() {
      	return new UserDetailServiceImpl();
      }
    
    
      /**
       * 加密工具
       * 2.x 版本的 spring-security-starter 必須加上
       *
       * @return
       */
      @Bean
      public PasswordEncoder passwordEncoder() {
      	return new BCryptPasswordEncoder();
      }
    
      }


UserDetailService 接口

通過重寫 UserDetailService 接口的 loadUserByUsername方法來實(shí)現(xiàn)登錄邏輯,在loadUserByUsername 方法里我們可以讀取數(shù)據(jù)庫或者其他存儲(chǔ)介質(zhì),來校驗(yàn)我們的用戶是否存在。最后將我們實(shí)現(xiàn)的類配置到config方法中。

/**
 * 自定義登錄處理邏輯
 */
public class UserDetailServiceImpl implements UserDetailsService {

/*    @Autowired
private PasswordEncoder passwordEncoder;*/

/**
 * @param username 登錄頁面輸入的用戶名
 * @return
 * @throws UsernameNotFoundException
 */
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    // TODO 根據(jù) username 去用戶表查詢出來用戶的信息,然后進(jìn)行驗(yàn)證

    // 驗(yàn)證成功后,返回Spring-Security 提供的 User 對(duì)象
    // 對(duì)應(yīng)三個(gè)構(gòu)造參數(shù)依次是: 1.用戶名 2.密碼(經(jīng)過 passwordEncoder 加密后的密碼) 3.權(quán)限列表
    return new User(username, "$2a$10$g1gzj4KvMNY1kMZT1xDx9ufLuaDvCFDpX.PdETx85zQwXI/Mn4ttC", AuthorityUtils.createAuthorityList("admin"));
}

public static void main(String[] args) {
    System.out.println(new BCryptPasswordEncoder().encode("123456"));// $2a$10$g1gzj4KvMNY1kMZT1xDx9ufLuaDvCFDpX.PdETx85zQwXI/Mn4ttC
}
}

其他需要注意的點(diǎn)

  • 在 configure(HttpSecurity http) 方法中需要加上 http.csrf().disable();不用問為什么,加上就完事了。

  • 當(dāng)我們重寫了config 方法后,spring-security 就不會(huì)攔截我們要訪問的資源了,所以需要重新配置下

http.authorizeRequests().antMatchers("/form/login","/loginPage.html").permitAll().anyRequest().authenticated();

  • 當(dāng)我們定義了UserDetailService,應(yīng)用啟動(dòng)時(shí)控制臺(tái)就不會(huì)打印默認(rèn)密碼了。

  • 高版本的 security 必須要配置密碼加密工具類。不然會(huì)報(bào)錯(cuò)

      passwordEncoder is null


關(guān)于Spring security 02中怎么自定義用戶登錄頁面和登錄處理邏輯問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI