最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring security實現(xiàn)對賬戶進行加密

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

一、原理分析1.1加密原理

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

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

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

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

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

1.2加密后的登錄過程

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

二、代碼實現(xiàn)

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

在配置文件中配置加密類

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

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

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

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

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

@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) {
  //對密碼加密
  userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
  userDao.add(userInfo);
}

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

dao層這里就不再列舉了。

三、測試

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

選擇注冊新賬號后跳轉(zhuǎn)到注冊頁面

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


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

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

四、用加密后的賬號登錄

此時如果使用剛剛新建的這個賬號進行登錄就會登錄失敗。因為我們并沒有配置spring security認證時的加密方式,默認是不進行加密,所以會直接將前臺輸入的密碼和數(shù)據(jù)庫中的加密字符串進行比較。

要使用這個賬號登錄還需要進行如下配置

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

<security:authentication-manager>
    <!--配置使用給定的userservice完成認證-->
    <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}字符串,本來這個就是為了適配密碼未加密的情況

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

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

注意如果進行了上面兩部,數(shù)據(jù)庫中以前的賬戶將不能進行登錄了,因為數(shù)據(jù)庫中的密碼是沒有加密的,而框架會對前臺傳遞的密碼進行加密后再和數(shù)據(jù)庫中的比較。所以一定要記住上面新注冊的這個賬號admin/admin

這里我給出admin對應的加密字符串

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

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

五、總結(jié)

添加賬戶主要是需要用spring security自帶的加密類BCryptPasswordEncoder對用戶密碼進行加密。

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

配置后原來的賬號因為密碼沒有加密將不能使用

六、示例工程源碼

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

示例工程

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java中IO流簡介_動力節(jié)點Java學院整理

    Java中IO流簡介_動力節(jié)點Java學院整理

    Java io系統(tǒng)的設計初衷,就是為了實現(xiàn)“文件、控制臺、網(wǎng)絡設備”這些io設置的通信。接下來通過本文給大家介紹Java中IO流簡介,感興趣的朋友一起看看吧
    2017-05-05
  • SpringBoot項目從搭建到發(fā)布一條龍

    SpringBoot項目從搭建到發(fā)布一條龍

    這篇文章主要介紹了SpringBoot項目從搭建到發(fā)布一條龍,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Java正則表達式循環(huán)匹配字符串方式

    Java正則表達式循環(huán)匹配字符串方式

    這篇文章主要介紹了Java正則表達式循環(huán)匹配字符串方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • mybatis-plus插入失敗的問題及解決

    mybatis-plus插入失敗的問題及解決

    這篇文章主要介紹了mybatis-plus插入失敗的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java 用遞歸獲取一個目錄下的所有文件路徑的小例子

    java 用遞歸獲取一個目錄下的所有文件路徑的小例子

    還是日志的問題,log4j生成的日志文件,自動保存到月份所在的文件夾中,需要獲取到所有的日志文件,包括文件夾
    2013-09-09
  • Java synchronized鎖升級jol過程詳解

    Java synchronized鎖升級jol過程詳解

    這篇文章主要介紹了Java synchronized鎖升級jol過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • java集合List快速實現(xiàn)重復判斷的方法小結(jié)

    java集合List快速實現(xiàn)重復判斷的方法小結(jié)

    在java編寫代碼中經(jīng)常會遇到某些重復判定或者去重的操作,本文主要為大家介紹了幾個常用方法,感興趣的小伙伴可以跟隨不想一起學習一下
    2024-12-12
  • Java中使用阻塞隊列控制線程集實例

    Java中使用阻塞隊列控制線程集實例

    這篇文章主要介紹了Java控制阻塞隊列線程集實例,本文用一個程序展示了如何使用阻塞隊列來控制線程集,程序功能是在一個目錄及它的所有子目錄下搜索所有文件,打印出包含指定關鍵字的文件列表,需要的朋友可以參考下
    2015-01-01
  • Java+opencv3.2.0實現(xiàn)模板匹配

    Java+opencv3.2.0實現(xiàn)模板匹配

    這篇文章主要為大家詳細介紹了Java+opencv3.2.0實現(xiàn)模板匹配的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 深入解析Java類加載的案例與實戰(zhàn)教程

    深入解析Java類加載的案例與實戰(zhàn)教程

    本篇文章主要介紹Tomcat類加載器架構(gòu),以及基于類加載和字節(jié)碼相關知識,去分析動態(tài)代理的原理,對Java類加載相關知識感興趣的朋友一起看看吧
    2022-05-05

最新評論

苏尼特左旗| 安仁县| 同心县| 奈曼旗| 正宁县| 平乐县| 郁南县| 那曲县| 安庆市| 五指山市| 祁东县| 木里| 盖州市| 平顶山市| 托克逊县| 米脂县| 喀喇沁旗| 临湘市| 汉寿县| 化州市| 庆城县| 宜川县| 永吉县| 通化县| 梅河口市| 神农架林区| 梁山县| 北海市| 尤溪县| 宜昌市| 玉林市| 赤壁市| 泰宁县| 安平县| 泾阳县| 平遥县| 大港区| 台北县| 彭山县| 栾川县| 吉木乃县|