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

Spring security實(shí)現(xiàn)對(duì)賬戶進(jìn)行加密

 更新時(shí)間:2020年03月07日 14:32:15   作者:程序曉猿  
這篇文章主要介紹了Spring security實(shí)現(xiàn)對(duì)賬戶進(jìn)行加密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、原理分析1.1加密原理

首先前端頁面發(fā)送注冊(cè)的賬戶信息到controller層,然后依次經(jīng)過service層和dao層,最后入庫。其中對(duì)密碼的加密應(yīng)該放在service層進(jìn)行,加密后再入庫。

spring security中有一個(gè)加密類BCryptPasswordEncoder可以用來對(duì)密碼進(jìn)行加密,調(diào)用其中的encode方法返回一個(gè)加密后的字符串

public String encode(CharSequence rawPassword) {
    String salt;
    if (strength > 0) {
      if (random != null) {
        salt = BCrypt.gensalt(strength, random);
      }
      else {
        salt = BCrypt.gensalt(strength);
      }
    }
    else {
      salt = BCrypt.gensalt();
    }
    return BCrypt.hashpw(rawPassword.toString(), salt);
}

使用時(shí)可以在spring的配置文件中配置一個(gè)加密類的bean,這樣在service中可以直接注入

加密后數(shù)據(jù)庫中存儲(chǔ)的是加密過后的字符串。

1.2加密后的登錄過程

對(duì)密碼進(jìn)行加密后數(shù)據(jù)庫中存儲(chǔ)的是加密字符串,用戶發(fā)起登錄請(qǐng)求后,框架會(huì)使用相同的加密算法對(duì)前端傳遞的密碼進(jìn)行加密并得到加密字符串,然后和數(shù)據(jù)庫中查詢到的字符串進(jìn)行對(duì)比。

二、代碼實(shí)現(xiàn)

具體的工程代碼可以參考我的工程示例,下文中只給出了和添加用戶相關(guān)的部分。

在配置文件中配置加密類

<bean id="passwordEncoder"   class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
  </bean>

2.1添加用戶的頁面如下, register.html

<html>
  <head>
    <meta charset="UTF-8">
    <title>注冊(cè)頁面</title>
  </head>
  <body>

  <form action="/user/add.do" method="post">
    用戶名:<input type="text" name="username" placeholder="請(qǐng)輸入用戶名"><br>
    密 碼:<input type="password" name="password" placeholder="請(qǐng)輸入密碼"><br>
    <input type="submit" value="注冊(cè)">
  </form>
  </body>
</html>

2.2controller層創(chuàng)建一個(gè)增加用戶的方法

@RestController
@RequestMapping("/user")
public class UserController {

  @Autowired
  private IUserService userService;

  @PostMapping("/add")
  public String add(UserInfo userInfo){
    userService.add(userInfo);
    return "success";
  }
}

2.3service層

@Autowired
private BCryptPasswordEncoder passwordEncoder;
...//省略其他
@Override
public void add(UserInfo userInfo) {
  //對(duì)密碼加密
  userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
  userDao.add(userInfo);
}

這里的passwordEncoder就是在配置文件中配置的加密bean,注入后可以直接使用

dao層這里就不再列舉了。

三、測(cè)試

啟動(dòng)工程并成功登錄后,跳轉(zhuǎn)到首頁,

選擇注冊(cè)新賬號(hào)后跳轉(zhuǎn)到注冊(cè)頁面

輸入賬戶和密碼后注冊(cè),會(huì)在數(shù)據(jù)庫中插入一條新的記錄。


這里我頁面上輸入的是 admin/admin,數(shù)據(jù)庫中存儲(chǔ)的password是加密后的

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

四、用加密后的賬號(hào)登錄

此時(shí)如果使用剛剛新建的這個(gè)賬號(hào)進(jìn)行登錄就會(huì)登錄失敗。因?yàn)槲覀儾]有配置spring security認(rèn)證時(shí)的加密方式,默認(rèn)是不進(jìn)行加密,所以會(huì)直接將前臺(tái)輸入的密碼和數(shù)據(jù)庫中的加密字符串進(jìn)行比較。

要使用這個(gè)賬號(hào)登錄還需要進(jìn)行如下配置

在spring security的配置文件中配置加密策略

<security:authentication-manager>
    <!--配置使用給定的userservice完成認(rèn)證-->
    <security:authentication-provider user-service-ref="userService">
      <security:password-encoder ref="passwordEncoder"/>
    </security:authentication-provider>
  </security:authentication-manager>

  <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
  </bean>

在userService的loadUserByUsername方法中去除密碼字符串上拼接的{noop}字符串,本來這個(gè)就是為了適配密碼未加密的情況

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    UserInfo userInfo = userDao.findByUsername(username);
    User user=new User(userInfo.getUsername(),userInfo.getPassword(),getRoles());
    return user;
}

然后使用剛才注冊(cè)的 admin/admin就可以登錄成功了。

注意如果進(jìn)行了上面兩部,數(shù)據(jù)庫中以前的賬戶將不能進(jìn)行登錄了,因?yàn)閿?shù)據(jù)庫中的密碼是沒有加密的,而框架會(huì)對(duì)前臺(tái)傳遞的密碼進(jìn)行加密后再和數(shù)據(jù)庫中的比較。所以一定要記住上面新注冊(cè)的這個(gè)賬號(hào)admin/admin

這里我給出admin對(duì)應(yīng)的加密字符串

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

如果大家忘記了剛才注冊(cè)的賬號(hào),可以在數(shù)據(jù)庫中插入一條admin/admin的記錄。

五、總結(jié)

添加賬戶主要是需要用spring security自帶的加密類BCryptPasswordEncoder對(duì)用戶密碼進(jìn)行加密。

要使用新注冊(cè)的賬戶登錄就需要在配置文件中配置加密策略

配置后原來的賬號(hào)因?yàn)槊艽a沒有加密將不能使用

六、示例工程源碼

示例工程已經(jīng)上傳到碼云上,如果有需要?dú)g迎大家參考

示例工程

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合Vue實(shí)現(xiàn)微信掃碼支付以及微信退款功能詳解

    SpringBoot整合Vue實(shí)現(xiàn)微信掃碼支付以及微信退款功能詳解

    最近公司要在微信公眾號(hào)上做一個(gè)活動(dòng)預(yù)報(bào)名,活動(dòng)的門票等需要在微信中支付,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Vue實(shí)現(xiàn)微信掃碼支付以及微信退款功能的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 比較常用UML類圖幾種關(guān)系的小結(jié)

    比較常用UML類圖幾種關(guān)系的小結(jié)

    本文給大家總結(jié)了UML類圖中幾種比較常用的關(guān)系小總結(jié),需要的朋友可以參考下
    2015-10-10
  • Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解

    Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解

    簡(jiǎn)單說,ElasticSearch(簡(jiǎn)稱 ES)是搜索引擎,是結(jié)構(gòu)化數(shù)據(jù)的分布式搜索引擎。下面這篇文章主要給大家介紹了關(guān)于Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-05-05
  • mybatis if test條件判斷語句中的判斷問題分析

    mybatis if test條件判斷語句中的判斷問題分析

    這篇文章主要介紹了mybatis if test條件判斷語句中的判斷問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解mybatis plus使用insert沒有返回主鍵的處理

    詳解mybatis plus使用insert沒有返回主鍵的處理

    這篇文章主要介紹了詳解mybatis plus使用insert沒有返回主鍵的處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot依賴注入的詳細(xì)介紹、使用技巧

    SpringBoot依賴注入的詳細(xì)介紹、使用技巧

    在Spring Boot中,依賴注入是一項(xiàng)關(guān)鍵的特性,它通過容器來管理和注入應(yīng)用程序中的各種組件,本文介紹SpringBoot依賴注入的詳細(xì)介紹、使用技巧,感興趣的朋友一起看看吧
    2024-01-01
  • Java多線程之同步工具類Exchanger

    Java多線程之同步工具類Exchanger

    這篇文章主要介紹了Java多線程之同步工具類Exchanger,Exchanger 是一個(gè)用于線程間協(xié)作的工具類,Exchanger用于進(jìn)行線程間的數(shù)據(jù)交換,它提供一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),兩個(gè)線程可以交換彼此的數(shù)據(jù),下面來看看具體內(nèi)容吧
    2021-10-10
  • lombok中@Data使用常見的小坑及解決

    lombok中@Data使用常見的小坑及解決

    在Java中使用Lombok庫的@Data注解時(shí),布爾類型屬性可能導(dǎo)致生成的get方法不符合預(yù)期,對(duì)于非is開頭的布爾屬性,Lombok生成的方法會(huì)添加is前綴,導(dǎo)致原本期待的get方法不存在,例如,對(duì)于屬性private boolean active,Lombok會(huì)生成方法名為isActive而不是getActive
    2024-10-10
  • Java啟動(dòng)命令大全(匯總)

    Java啟動(dòng)命令大全(匯總)

    Java啟動(dòng)命令是所有java應(yīng)用程序的入口,通過它來啟動(dòng)Java運(yùn)行時(shí)環(huán)境,并加載相關(guān)的class,本文希望做一個(gè)Java啟動(dòng)命令的匯總,和各位同道分享,也便于日后作為自己的參考
    2023-09-09
  • springboot配置文件讀取pom文件信息方式

    springboot配置文件讀取pom文件信息方式

    這篇文章主要介紹了springboot配置文件讀取pom文件信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論