SpringSecurity學習
RBAC
RBAC是基於角色的訪問控制(Role-Based Access Control )在RBAC中,權限與角色相關聯,用戶通過成為適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。這樣管理都是層級相互依賴的,權限賦予給角色,而把角色又賦予用戶,這樣的權限設計很清楚,管理起來很方便。
角色的訪問權限控制涉及到授權和認證
- 授權:給角色分配操作資源的權限管理
驗證某個用戶是否為系統中的合法主體,也就是說用戶能否訪問該系統。用戶認證一般要求用戶提供用戶名和密碼。系統通過校驗用戶名和密碼來完成認證過程。通俗點說就是系統認為用戶是否能登錄。
- 認證:用戶登錄 查詢當前用戶扮演的角色擁有的權限然后存入會話
驗證某個用戶是否有權限執行某個操作。在一個系統中,不同用戶所具有的權限是不同的。比如對一個文件來說,有的用戶只能進行讀取,而有的用戶可以進行修改。一般來說,系統會為不同的用戶分配不同的角色,而每個角色則對應一系列的權限。通俗點講就是系統判斷用戶是否有權限去做某些事情。
角色的訪問權限基本的5張表
所需要的的表
用戶表
角色表
用戶角色表
資源表
權限表
權限框架
- Apache Shiro
shiro 是一個功能強大和易於使用的Java安全框架,為開發人員提供一個直觀而全面的解決方案的認證,授權,加密,會話管理。
- Spring Security
相對於 Shiro,在 SSM/SSH 中整合 Spring Security 都是比較麻煩的操作,所以,Spring Security 雖然功能比 Shiro 強大,但是使用反而沒有 Shiro 多(Shiro 雖然功能沒有 Spring Security 多,但 是對於大部分項目而言,Shiro 也夠用了)。
自從有了 Spring Boot 之后,Spring Boot 對於 Spring Security 提供了 自動化配置方案,可以零配置使用 Spring Security。
因此,一般來說,常見的安全管理技術棧的組合是這樣的:
SSM + Shiro
Spring Boot/Spring Cloud + Spring Security
Spring Security
SpringSecurity 是 Spring 家族中的成員。SpringSecurity 基於 Spring 框架,提供了一套 Web 應用安全性的完整解決方案。正如你可能知道的關於安全方面的兩個主要區域是“認證”和“授權”(或者訪問控制),一般來說,Web 應用的安全性包括用戶認證(Authentication)和用戶授權(Authorization)兩個部分,這兩點也是 Spring Security 重要核心功能,也是Spring Boot底層安全模塊默認的技術選型,他可以實現強大的Web安全控制,對於安全控制,我們僅需要引入spring-boot-starter-security模塊,進行少量的配置,即可實現強大的安全管理!。
Spring Security環境搭建
- 創建springboot項目
- 添加依賴
<!-- spring security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- web組件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 測試組件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
</dependency>
- 登錄界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄頁面</title>
</head>
<body>
<form action="/login" method="post">
賬號: <input type="text" name="username"/><br/>
密碼:<input type="password" name="password"/><br/>
<input type="submit" value="提交" /> <input type="reset" value="重置"/>
</form>
</body>
</html>
測試
輸入地址 http://localhost:8080/login.html , 進入Spring Security默認登錄界面,輸入用戶名:user,密碼:是后台提供的password
測試成功
這樣Spring Security就搭建好了
PasswordEncoder密碼解析器詳解
接口有三個方法
// 表示把參數按照特定的解析規則進行解析
String encode(CharSequence rawPassword);
// 表示驗證從存儲中獲取的編碼密碼與編碼后提交的原始密碼是否匹配。如果密碼匹配,則返回 true;如果不匹配,則返回 false。第一個參數表示需要被解析的密碼。第二個參數表示存儲的密碼。
boolean matches(CharSequence rawPassword, String encodedPassword);
// 表示如果解析的密碼能夠再次進行解析且達到更安全的結果則返回 true,否則返回false。默認返回 false。
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
PasswordEncoder是一個接口,這個接口有很多的實現類
密碼加密encode()
PasswordEncoder encoder=new BCryptPasswordEncoder();
//密碼加密
System.out.println(encoder.encode("123456"));
密碼比較matches()
//密碼比較
PasswordEncoder encoder=new BCryptPasswordEncoder();
System.out.println(encoder.matches("123456", "$2a$10$h3NsFe/869EG.NZpgZSaduUy6/7S6kPL6wObzsT5ttbfR1P/TFjFq"));
記住幾個類:
- WebSecurityConfigurerAdapter:自定義Security策略。
- AuthenticationManagerBuilder:自定義認證策略
- @EnableWebSecurity:開啟WebSecurity模式------@EnableXXXX 開啟某個功能
Spring Security的兩個主要目標是“認證”和“授權”(訪問控制)。
“認證”(Authentication)
“授權”(Authorization)
這個概念是通用的,而不是只在Spring Security中存在。