溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Spring中利用security加密賬戶

發布時間:2021-04-16 17:21:56 來源:億速云 閱讀:233 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關怎么在Spring中利用security加密賬戶,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、原理分析1.1加密原理

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

spring security中有一個加密類BCryptPasswordEncoder可以用來對密碼進行加密,調用其中的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中可以直接注入

加密后數據庫中存儲的是加密過后的字符串。

1.2加密后的登錄過程

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

二、代碼實現

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

在配置文件中配置加密類

<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層創建一個增加用戶的方法

@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層這里就不再列舉了。

三、測試

啟動工程并成功登錄后,跳轉到首頁,

怎么在Spring中利用security加密賬戶

選擇注冊新賬號后跳轉到注冊頁面

怎么在Spring中利用security加密賬戶

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

怎么在Spring中利用security加密賬戶

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

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

四、用加密后的賬號登錄

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

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

在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就可以登錄成功了。

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

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

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

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

上述就是小編為大家分享的怎么在Spring中利用security加密賬戶了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女