spring security 開發 基於表單的認證

終於進入 spring security 的章節了


在這裏插入圖片描述

http basic 安全驗證

在第一章構建項目中說到
當項目依賴中 含有 spring security 的jar 包時
它會有一個默認的安全配置http basic
所有一開始我們用下面的註解移除掉了它的默認安全配置

在這裏插入圖片描述
spring security 默認的安全驗證我們一般是不用的

實現用戶名+密碼認證

開始開發基於表單的安全驗證

創建 BrowserSecurityConfig 類 配置安全驗證

在這裏插入圖片描述

@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()   //指定身份認證的方式爲表單登錄
                .and()
                .authorizeRequests() //對請求授權
                .anyRequest()        //任何請求
                .authenticated();    //安全認證
        //任何請求都必須經過表單驗證才能進行訪問

    }
}

運行並測試

直接運行我們這個項目 demoApplication ,發現報錯

No qualifying bean of type 'org.springframework.security.config.annotation.ObjectPostProcessor<?>' available
2019-04-06 19:31:05.208  INFO 18932 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]

https://stackoverflow.com/questions/32081578/spring-security-nosuchbeandefinitionexception-no-qualifying-bean-of-type-org
原因是我們關閉了spring security的安全驗證配置
把紅框裏的註解去掉
在這裏插入圖片描述

再次運行 成功
訪問 http://localhost:8080/hello 後會跳到登錄界面

用戶名爲 user
密碼 在 控制檯打印出了,這個密碼每次啓動都會變
在這裏插入圖片描述
當登錄成功後,它又會跳到我們之前訪問的url

如果還想用http basic 驗證 ,只需更改一行代碼
在這裏插入圖片描述
這樣就可以了

基本原理

主要是由一層層過濾器構成····
在這裏插入圖片描述

自定義用戶認證邏輯

處理用戶信息獲取邏輯

用戶信息的獲取 在 spring security 中是被 封裝在 userDetailService 接口中
在這裏插入圖片描述
自定義自己的userDetailService 實現類
在這裏插入圖片描述

@Component
public class MyUserDetailsService implements UserDetailsService {
    // 這裏注入dao 層 用於查詢數據庫

    Logger logger = LoggerFactory.getLogger(getClass());

    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        //根據用戶名從數據庫查找用戶信息

        logger.info("登錄用戶名"+ userName);
        //我們要驗證用戶名 密碼 並 查取權限
        User admin = new User(userName, "123456",
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));//第三個參數是做授權的
        return admin;
    }
}

啓動應用 訪問 http://localhost:8080/hello 輸入用戶密碼後臺報錯
在這裏插入圖片描述
原因:版本升級 因爲Spring security 5.0中新增了多種加密方式,也改變了密碼的格式。
https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released
https://docs.spring.io/spring-security/site/docs/5.0.0.RELEASE/reference/htmlsingle/#ns-password-encoder
https://www.cnblogs.com/majianming/p/7923604.html
https://blog.csdn.net/Canon_in_D_Major/article/details/79675033
解決:待會解決 需要配置 PasswordEncoder

處理用戶校驗邏輯

用戶是否凍結,密碼是否過期等驗證信息
在這裏插入圖片描述

處理密碼加密解密邏輯

配置 PasswordEncoder

在這裏插入圖片描述
修改 MyUserDetailsService 的 loadUserByUsername 的方法
在這裏插入圖片描述
在這裏插入圖片描述

測試成功 ,也解決了之前的問題
在這裏插入圖片描述

注意 密碼都是123456 ,但每次打印出來得密碼都不一樣 不像md5

因爲他會隨機生成一個鹽,將隨機生成的鹽混在密碼串裏面,當他判斷的時候 再用隨機生成的鹽來反推當時的密碼串

個性化用戶認證流程

自定義登錄頁面

定義登錄頁面 ,並配置 以及 可能出現的錯誤原因
在這裏插入圖片描述

<html>
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
<h2>標準登錄頁面</h2>
<h3>表單登錄</h3>
<form action="/authentication/form" method="post">
    <table>
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>密碼:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td colspan="2"><button type="submit">登錄</button></td>
        </tr>
    </table>
</form>
</body>
</html>

配置登錄頁面 即 會有的錯誤
在這裏插入圖片描述
解決
在這裏插入圖片描述
啓動測試 成功
在這裏插入圖片描述

自定義登錄成功處理

在這裏插入圖片描述
在這裏插入圖片描述
具體要求和解釋如下
https://docs.spring.io/spring-security/site/docs/5.2.0.BUILD-SNAPSHOT/api/

自定義失敗處理

實現手機號+短信認證

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章