spring security進階2 添加帳戶並對帳戶密碼進行加密

spring security 添加帳戶並對帳戶密碼進行加密

上一篇博文中介紹了spring security如何使用數據庫中的帳戶進行認證登陸,此次來總結下如何給數據庫添加帳戶並對密碼加密。前端

上一篇:使用數據庫密碼進行認證java

1、原理分析

1.1加密原理

首先前端頁面發送註冊的帳戶信息到controller層,而後依次通過service層和dao層,最後入庫。其中對密碼的加密應該放在service層進行,加密後再入庫。git

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中能夠直接注入spring

加密後數據庫中存儲的是加密事後的字符串。數據庫

1.2加密後的登陸過程

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

2、代碼實現

具體的工程代碼能夠參考個人工程示例,下文中只給出了和添加用戶相關的部分。框架

在配置文件中配置加密類dom

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

3、測試

啓動工程併成功登陸後,跳轉到首頁,

選擇註冊新帳號後跳轉到註冊頁面

輸入帳戶和密碼後註冊,會在數據庫中插入一條新的記錄。


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

$2a$10$URSaaafrPOCjFYvhrhQbku2/l36IJ0zH0G8xeJzf5lAH2F1JJ1ybG

4、用加密後的帳號登陸

此時若是使用剛剛新建的這個帳號進行登陸就會登陸失敗。由於咱們並無配置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的記錄。

5、總結

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

要使用新註冊的帳戶登陸就須要在配置文件中配置加密策略

配置後原來的帳號由於密碼沒有加密將不能使用

6、示例工程源碼

示例工程已經上傳到碼雲上,若是有須要歡迎你們參考

示例工程

相關文章
相關標籤/搜索