您好,登錄后才能下訂單哦!
Spring security 02中怎么自定義用戶登錄頁面和登錄處理邏輯,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Spring Security 01- 將 Spring security 引入到工程
Spring security 02-自定義用戶登錄頁面和登錄處理邏輯
Spring security 03-自定義登錄成功后的處理邏輯
Spring security 04-整合 jwt
Spring Security 01- 將 Spring security 引入到工程
Spring security 02-自定義用戶登錄頁面和登錄處理邏輯
Spring security 03-自定義登錄成功后的處理邏輯
Spring security 04-整合 jwt
上一篇(在項目里面引入spring-security會發生什么)我們將 Spring-seccurity 引入到了我們的spring-boot工程中,沒有做多余的配置,spring-security 就已經默認幫我們配置了一個攔截器,應用啟動后,當我們訪問應用提供的資源時,都會跳轉到 security 為我們提供的一個默認登陸頁,當我們輸入security為我們提供的用戶名和密碼,登陸成功后,就可以獲取我們需要的資源。那么問題來了!我們如何自定義自己的登錄頁面,以及使用我們自己的用戶信息去登錄呢?
為了不影響之前的版本,我們這里新建一個模塊 spring-security-02,之前的版本是spring-security-01. https://github.com/nimo10050/spring-security-sample/tree/master/spring-security-02
依賴跟上個版本一樣,如下:
<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>
既然我們需要自定義一些東西,只能通過額外配置的方式來實現。所以這里引入了spring-security的配置類
添加 @Component注解
添加 Spring-security 的注解 EnableWebSecurity 標記這是 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();// 必須有, 不然會 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 { /* 將用戶信息存儲到內存中 實際上不會這樣做,了解下即可 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 接口的 loadUserByUsername方法來實現登錄邏輯,在loadUserByUsername 方法里我們可以讀取數據庫或者其他存儲介質,來校驗我們的用戶是否存在。最后將我們實現的類配置到config方法中。
/** * 自定義登錄處理邏輯 */ public class UserDetailServiceImpl implements UserDetailsService { /* @Autowired private PasswordEncoder passwordEncoder;*/ /** * @param username 登錄頁面輸入的用戶名 * @return * @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // TODO 根據 username 去用戶表查詢出來用戶的信息,然后進行驗證 // 驗證成功后,返回Spring-Security 提供的 User 對象 // 對應三個構造參數依次是: 1.用戶名 2.密碼(經過 passwordEncoder 加密后的密碼) 3.權限列表 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 } }
在 configure(HttpSecurity http) 方法中需要加上 http.csrf().disable();不用問為什么,加上就完事了。
當我們重寫了config 方法后,spring-security 就不會攔截我們要訪問的資源了,所以需要重新配置下
http.authorizeRequests().antMatchers("/form/login","/loginPage.html").permitAll().anyRequest().authenticated();
當我們定義了UserDetailService,應用啟動時控制臺就不會打印默認密碼了。
高版本的 security 必須要配置密碼加密工具類。不然會報錯
passwordEncoder is null
關于Spring security 02中怎么自定義用戶登錄頁面和登錄處理邏輯問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。