天天看點

Spring Boot 最簡單整合Shiro+JWT方式引入依賴配置檔案運用測試

簡介

目前

RESTful

大多都采用

JWT

來做授權校驗,在

Spring Boot

中可以采用

Shiro

JWT

來做簡單的權限以及認證驗證,在和

Spring Boot

內建的過程中碰到了不少坑。便結合自身以及大家的常用的運用場景開發出了這個最簡單的整合方式

fastdep-shiro-jwt

源碼位址

希望大家可以star支援一下,後續還會加入其它依賴的簡易整合。

https://github.com/louislivi/fastdep

引入依賴

  • Maven

<dependency>
    <groupId>com.louislivi.fastdep</groupId>
    <artifactId>fastdep-shiro-jwt</artifactId>
    <version>1.0.2</version>
</dependency>           
  • Gradle

    compile group: 'com.louislivi.fastdep', name: 'fastdep-redis', version: '1.0.2'           

配置檔案

  • application.yml

    fastdep:
    shiro-jwt:
      filter: #shiro過濾規則
        admin:
          path: /admin/**
          role: jwt # jwt為需要進行token校驗
        front:
          path: /front/**/**
          role: anon # anon為無需校驗
      secret: "6Dx8SIuaHXJYnpsG18SSpjPs50lZcT52" # jwt秘鑰
    #    expireTime: 7200000 # token有效期
    #    prefix: "Bearer "  # token校驗時的字首
    #    signPrefix: "Bearer " # token生成簽名的字首
    #    header: "Authorization" # token校驗時的header頭
    #    以下對應為shiro配置參數,無特殊需求無需配置
    #    loginUrl: 
    #    successUrl: 
    #    unauthorizedUrl: 
    #    filterChainDefinitions:            
  • 使用者權限配置類
    @Component
    public class FastDepShiroJwtConfig extends FastDepShiroJwtAuthorization {
      
      @Autowired
      private UserRequestDataMapper userRequestDataMapper;
    
      @Override
      public SimpleAuthorizationInfo getAuthorizationInfo(String userId) {
          // 查詢該使用者下的所有權限(目前為示例僅查詢使用者ID真實環境替換為使用者的權限值)
          Set<String> collect = userRequestDataMapper.selectOptions().stream().map(u -> u.getUserId().toString()).collect(Collectors.toSet());
            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
            System.out.println(collect);
            // 目前值為 [1]
            // 添加使用者權限到SimpleAuthorizationInfo中
            simpleAuthorizationInfo.addStringPermissions(collect);
            return simpleAuthorizationInfo;
        }
    }           

運用

@RestController
public class TestController {
    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 目前為示例是以直接傳回了token,真實環境為校驗登入資訊後再傳回token即可
     * @author : louislivi
     */
    @GetMapping("front/login")
    public String login() {
        // ...校驗登入資訊是否正确
        // 傳入使用者唯一标示
        return jwtUtil.sign("1"); 
    }

    /**
     * 目前為示例是以權限寫的是使用者ID 真實環境替換為權限key
     * @author : louislivi
     */
    @GetMapping("admin")
    @RequiresPermissions("1")
    public String jwt() {
        return "ok!";
    }
}           

測試

1.擷取

token

2.測試權限校驗

  • 帶token
  • 不帶token
    {
        "msg": "Access denied !",
        "code": 401
    }           
    • 帶上token但是,

      SimpleAuthorizationInfo

      中無指定權限
{
    "msg": "Subject does not have permission [1]",
    "code": 403
}           
擴充

有時候需要自定義權限校驗以及錯誤傳回資訊結構等,這時候就需要重寫

FastDepShiroJwtAuthorization

類中的方法。更多詳情請看

這裡

原理

使用

ImportBeanDefinitionRegistrar

BeanDefinitionBuilder.genericBeanDefinition

動态注入

Bean

其實很簡單有興趣可以去看看源碼,這樣的依賴內建是不是簡單了很多呢?

希望大家能夠支援開源,給個小星星,後續還會繼續開發其他依賴的整合,甚至相容其他架構使用。

fastdep

java

整合依賴更簡單。在此也招募有志同道合的

coder

共同完善這個項目。