終於進入 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/