基於Spring security + Spring Boot + JWT的封裝框架快速入門指南

吐槽

近期做一個小玩意,打算實現前後端分離,那麼就要用到符合REST協議的API接口了。如果使用純API的話,就肯定不希望所有人都可以調用我的接口,所以對於API的安全就要重視了,對於我剛剛學習Spring Boot的人來說。第一就想到用Spring全家桶,百度一搜還真有:spring security就是這個安全組件,在配合JWT實現身份鑑定,這樣做服務器就不用存session,也完美解決了分佈式共享session的難題。然後就有了一下的故事,也希望大牛來給點建議。

地址:

demo代碼:https://github.com/q191995501/simple-spring-security-framework/tree/master/demo

源代碼:https://github.com/q191995501/simple-spring-security-framework/tree/master/security

jar包:https://github.com/q191995501/simple-spring-security-framework/releases

介紹

這是我自用的一個框架,暫且給它命名爲: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

有些同學可能會有疑問:

  1. 驗證頭是什麼?

在這裏插入圖片描述
加入請求頭部的key

  1. 用戶名字段是什麼意思?

    就是保存用戶名的字段名啦。上面配置中用戶名字段爲: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問答都可以聯繫到我。

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