基於Spring security + Spring Boot + JWT的封裝框架快速入門指南
吐槽
近期做一個小玩意,打算實現前後端分離,那麼就要用到符合REST協議的API介面了。如果使用純API的話,就肯定不希望所有人都可以呼叫我的介面,所以對於API的安全就要重視了,對於我剛剛學習Spring Boot的人來說。第一就想到用Spring全家桶,百度一搜還真有:spring security
就是這個安全元件,在配合JWT
實現身份鑑定,這樣做伺服器就不用存session
,也完美解決了分散式共享session
的難題。然後就有了一下的故事,也希望大牛來給點建議。
介紹
這是我自用的一個框架,暫且給它命名為:wyndem-security框架,小小的自戀一下,那麼這個框架適用於前後端分離的專案。對於需要跳轉頁面的需求暫時沒有。
特點
- 動態許可權設定
- 5分鐘即可搭建出一個完整的許可權控制功能
- 快速、簡單、對資料庫表無限制
- 自定義登入邏輯
- 對於新手非常友好
依賴
- Spring Boot
- Spring security
- jjwt
Maven
不包含Spring Boot,基本上建立Spring Boot專案的時候就自己生成依賴。 不會的話可用參考這篇:Spring Boot 2.x 入門
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.10.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.10.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.10.5</version> <scope>runtime</scope> </dependency>
快速開始(三步完成)
第一步:實現SecurityUserConfig
介面
SecurityUserConfig
的介面中需要實現2個方法:
- getUserRole(String userName) --根據使用者來返回該使用者是什麼角色
- getRoleUserMappingData() --返回角色對應的可訪問的url
Example: MyConfig .java
@Component public class MyConfig implements SecurityUserConfig { @Override public String getUserRole(String userName) { return "user"; } @Override public Map<String, List<String>> getRoleUserMappingData() { Map<String,List<String>> map=new HashMap<>(); List<String> urls=new ArrayList<>(); //指hi下的任何路徑都可訪問 urls.add("/hi/**"); //這裡是設定user角色可訪問的url map.put("user",urls); return map; } }
第二步:建立登入的Controller:
關於使用者登入,還是自己實現比較放心。
Example: DemoController .java
@Parameter(parameters = {"name","pwd"})
public Object login(String name,String pwd){
User user = new User();
if ("wen".equals(name)&&name.equals(pwd)){
user.setName("wen");
return user;
}else{
return user;
}
}
@GetMapping("/hi")
public Object example(){
return "你好,wyndem安全框架";
}
User.java
public class User{
private String name;
private String paw;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPaw() {
return paw;
}
public void setPaw(String paw) {
this.paw = paw;
}
}
這裡的login
方法不要寫Spring Mvc 上的Mapping對映,在後面會說到如何訪問。
關於login方法的限制
- 引數中必須為
String
型別 - 需要把引數的名字寫到Parameter註解上,多個這樣寫:@Parameter(parameters = {“引數1”,“引數2”}),單個直接寫:@Parameter(“引數1”)
- 返回的型別可以是Map,或者是物件,但是該物件一定要有個使用者名稱的欄位
- 登入成功,將使用者名稱填充,登入失敗,將使用者名稱為Null
第三步:填寫配置:
#驗證頭
cn.wenhaha.jwt.header=Authorization
#jwt的過期時間(單位:秒)
cn.wenhaha.jwt.expiration=100
#登入的url
cn.wenhaha.loginUrl=/login
#處理登入的Controller
cn.wenhaha.longinHandle=com.example.demo.DemoController
#使用者名稱欄位
cn.wenhaha.userNameField=name
#處理登入的方法
cn.wenhaha.loginMethodName=login
有些同學可能會有疑問:
- 驗證頭是什麼?
加入請求頭部的key
-
使用者名稱欄位是什麼意思?
就是儲存使用者名稱的欄位名啦。上面配置中使用者名稱欄位為:name,那是因為我User物件中name欄位是儲存使用者名稱的。如果你在登入方法中返回Map,那麼儲存使用者名稱的key就是使用者名稱欄位
啟動類:
@SpringBootApplication
@ComponentScan(basePackages={"com.example.demo","cn.wenhaha.security"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
注意:
ComponentScan:需要將cn.wenhaha.security包讓Spring Boot 掃描到
效果:
在之前配置中,只有user角色可以訪問/hi的url。那麼我直接訪問看看效果:
沒有認證:
登入
然後把登入拿到的Token,在進行一次請求
就到這裡了,有問題可以傳送郵件[email protected]或者用Chat問答都可以聯絡到我。