国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【實(shí)現(xiàn)微服務(wù)集成satoken在網(wǎng)關(guān)gateway處統(tǒng)一鑒權(quán)】

這篇具有很好參考價(jià)值的文章主要介紹了【實(shí)現(xiàn)微服務(wù)集成satoken在網(wǎng)關(guān)gateway處統(tǒng)一鑒權(quán)】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 內(nèi)容說明

本文旨在使用開源輕量級(jí) Java 權(quán)限認(rèn)證框架sa-token+springcloud-gateway實(shí)現(xiàn)微服務(wù)在網(wǎng)關(guān)處統(tǒng)一鑒權(quán)。sa-token參考地址:https://sa-token.cc/doc.html#/
項(xiàng)目按照業(yè)務(wù)分為三個(gè)板塊,如圖:

  1. api(也就是微服務(wù)中各種api接口,不涉及任何權(quán)限相關(guān)代碼,只提供服務(wù))
  2. auth(認(rèn)證中心,實(shí)現(xiàn)登陸邏輯)
  3. gateway(網(wǎng)關(guān),實(shí)現(xiàn)轉(zhuǎn)發(fā)等,主要是統(tǒng)一鑒權(quán))
    網(wǎng)關(guān)統(tǒng)一鑒權(quán),java,微服務(wù),gateway

2. 項(xiàng)目實(shí)現(xiàn)

首先在idea創(chuàng)建一個(gè)項(xiàng)目mirco,然后在項(xiàng)目下依次創(chuàng)建三個(gè)module,這就不展開說了。接下來各模塊填充內(nèi)容。

2.1. auth模塊

2.1.1. pom.xml依賴

主要是web、satoken、satoken整合redis:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.5.RELEASE</version>
    </dependency>
    <!-- Sa-Token 權(quán)限認(rèn)證,在線文檔:https://sa-token.cc -->
    <dependency>
        <groupId>cn.dev33</groupId>
        <artifactId>sa-token-spring-boot-starter</artifactId>
        <version>1.34.0</version>
    </dependency>
    <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
    <dependency>
        <groupId>cn.dev33</groupId>
        <artifactId>sa-token-dao-redis-jackson</artifactId>
        <version>1.34.0</version>
    </dependency>
    <!-- 提供Redis連接池 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
</dependencies>

2.1.2. controller類

提供登陸接口,實(shí)現(xiàn)登陸并返回登陸成功的token給前端:

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AuthController {

    @GetMapping("/auth/doLogin")
    public SaResult doLogin(String username, String password) {
        // 此處僅作模擬示例,真實(shí)項(xiàng)目需要從數(shù)據(jù)庫中查詢數(shù)據(jù)進(jìn)行比對(duì)
        if ("admin".equals(username) && "123456".equals(password)) {
            StpUtil.login(10001);
        } else if ("super".equals(username) && "123456".equals(password)) {
            StpUtil.login(10002);
        }else {
            return SaResult.error("登錄失敗");
        }
        // 第3步,返回給前端
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        return SaResult.ok("登錄成功").setData(tokenInfo);
    }
}

2.1.3. 啟動(dòng)類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AuthApplication {
    public static void main(String[] args) {
        SpringApplication.run(AuthApplication.class, args);
    }
}

2.1.4. application.yml配置文件

server:
  port: 8082
spring:
  # redis配置
  redis:
    # Redis數(shù)據(jù)庫索引(默認(rèn)為0)
    database: 1
    # Redis服務(wù)器地址
    host: 127.0.0.1
    # Redis服務(wù)器連接端口
    port: 6379
    # Redis服務(wù)器連接密碼(默認(rèn)為空)
    # password:
    # 連接超時(shí)時(shí)間
    timeout: 10s
    lettuce:
      pool:
        # 連接池最大連接數(shù)
        max-active: 200
        # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制)
        max-wait: -1ms
        # 連接池中的最大空閑連接
        max-idle: 10
        # 連接池中的最小空閑連接
        min-idle: 0

2.2. gateway模塊

2.2.1. pom.xml依賴

主要是gateway、satoken、satoken整合redis:

<dependencies>
    <!-- springCloud gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
        <version>2.2.10.RELEASE</version>
    </dependency>
    <!-- httpClient依賴,缺少此依賴api網(wǎng)關(guān)轉(zhuǎn)發(fā)請(qǐng)求時(shí)可能發(fā)生503錯(cuò)誤 -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
    <dependency>
        <groupId>cn.dev33</groupId>
        <artifactId>sa-token-reactor-spring-boot-starter</artifactId>
        <version>1.34.0</version>
    </dependency>
    <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
    <dependency>
        <groupId>cn.dev33</groupId>
        <artifactId>sa-token-dao-redis-jackson</artifactId>
        <version>1.34.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
</dependencies>

2.2.2. 全局過濾器

主要是配置路由進(jìn)行攔截鑒權(quán),這里是整個(gè)鑒權(quán)的核心,具體的路由配置規(guī)則參考sa-token官網(wǎng):

import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * [Sa-Token 權(quán)限認(rèn)證] 配置類
 */
@Configuration
public class SaTokenConfigure {
    // 注冊(cè) Sa-Token全局過濾器 
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 攔截地址
                .addInclude("/**")    /* 攔截全部path */
                // 開放地址
                .addExclude("/favicon.ico")
                // 鑒權(quán)方法:每次訪問進(jìn)入
                .setAuth(obj -> {
                    // 登錄校驗(yàn) -- 攔截所有路由,并排除/user/doLogin 用于開放登錄
                    SaRouter.match("/**", "/auth/doLogin", r -> StpUtil.checkLogin());

                    // 權(quán)限認(rèn)證 -- 不同模塊, 校驗(yàn)不同權(quán)限
                    SaRouter.match("/api/test1", r -> StpUtil.checkPermission("api.test1"));
                    SaRouter.match("/api/test2", r -> StpUtil.checkPermission("api.test2"));
                    SaRouter.match("/api/test3", r -> StpUtil.checkRoleOr("admin", "super"));

                    // 更多匹配 ...  */
                })
                // 異常處理方法:每次setAuth函數(shù)出現(xiàn)異常時(shí)進(jìn)入
                .setError(e -> {
                    return SaResult.error(e.getMessage());
                })
                ;
    }
}

2.2.3. 自定義權(quán)限接口

主要是定義用戶擁有的權(quán)限和角色,我這里直接寫死的,實(shí)際項(xiàng)目中通常應(yīng)該是auth認(rèn)證模塊登陸后從數(shù)據(jù)庫查出用戶的角色權(quán)限緩存到redis,然后這里再從redis取出來。

import cn.dev33.satoken.stp.StpInterface;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定義權(quán)限驗(yàn)證接口擴(kuò)展,在需要鑒權(quán)時(shí)自動(dòng)調(diào)用
 */
@Component
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一個(gè)賬號(hào)所擁有的權(quán)限碼集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 本list僅做模擬,實(shí)際項(xiàng)目中要根據(jù)具體業(yè)務(wù)邏輯來查詢權(quán)限
        List<String> list = new ArrayList<>();
        if (Integer.parseInt(loginId.toString()) == 10001) {
            list.add("api.test1");
        } else if (Integer.parseInt(loginId.toString()) == 10002) {
            list.add("api.test2");
        }
        return list;
    }

    /**
     * 返回一個(gè)賬號(hào)所擁有的角色標(biāo)識(shí)集合 (權(quán)限與角色可分開校驗(yàn))
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 本list僅做模擬,實(shí)際項(xiàng)目中要根據(jù)具體業(yè)務(wù)邏輯來查詢角色
        List<String> list = new ArrayList<>();
        if (Integer.parseInt(loginId.toString()) == 10001) {
            list.add("admin");
        } else if (Integer.parseInt(loginId.toString()) == 10002) {
            list.add("super");
        }
        return list;
    }

}

2.2.4. 啟動(dòng)類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

2.2.5. application.yml配置文件

server:
  port: 8083
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: api
          uri: http://127.0.0.1:8081
          predicates:
            - Path=/api/**
        - id: auth
          uri: http://127.0.0.1:8082
          predicates:
            - Path=/auth/**
  redis:
    # Redis數(shù)據(jù)庫索引(默認(rèn)為0)
    database: 1
    # Redis服務(wù)器地址
    host: 127.0.0.1
    # Redis服務(wù)器連接端口
    port: 6379
    # Redis服務(wù)器連接密碼(默認(rèn)為空)
    # password:
    # 連接超時(shí)時(shí)間
    timeout: 10s
    lettuce:
      pool:
        # 連接池最大連接數(shù)
        max-active: 200
        # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制)
        max-wait: -1ms
        # 連接池中的最大空閑連接
        max-idle: 10
        # 連接池中的最小空閑連接
        min-idle: 0

2.3. auth模塊

2.3.1. pom.xml依賴

主要是web:

<dependencies>
    <!-- SpringBoot Web模塊 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

2.3.2. controller類

提供一些接口,用來驗(yàn)證satoken權(quán)限:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @GetMapping("/api/test1")
    public String test1() {
        return "訪問成功--只有《api.test1》權(quán)限的才能訪問";
    }

    @GetMapping("/api/test2")
    public String test2() {
        return "訪問成功--只有《api.test2》權(quán)限的才能訪問";
    }

    @GetMapping("/api/test3")
    public String test3() {
        return "訪問成功--擁有《admin或者super角色》可以訪問";
    }

    @GetMapping("/api/test4")
    public String test4() {
        return "訪問成功--無需權(quán)限,登陸即可訪問";
    }

}

2.3.3. 啟動(dòng)類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }
}

2.3.4. application.yml配置文件

server:
  port: 8081

3. 項(xiàng)目測試

  1. 首先通過網(wǎng)關(guān)登陸:http://localhost:8083/auth/doLogin?username=admin&password=123456
    網(wǎng)關(guān)統(tǒng)一鑒權(quán),java,微服務(wù),gateway
    如圖正確的賬戶密碼登陸成功返回token,這里登陸的admin用戶。

  2. 不帶token訪問,訪問失?。篽ttp://localhost:8083/api/test1
    網(wǎng)關(guān)統(tǒng)一鑒權(quán),java,微服務(wù),gateway

  3. 攜帶token訪問,訪問成功:http://localhost:8083/api/test1
    網(wǎng)關(guān)統(tǒng)一鑒權(quán),java,微服務(wù),gateway

  4. 訪問無權(quán)限的接口失?。篽ttp://localhost:8083/api/test2

網(wǎng)關(guān)統(tǒng)一鑒權(quán),java,微服務(wù),gateway

  1. 訪問有角色權(quán)限的接口成功:http://localhost:8083/api/test3
    網(wǎng)關(guān)統(tǒng)一鑒權(quán),java,微服務(wù),gateway

4. 項(xiàng)目總結(jié)

至此,我們完成了gateway處統(tǒng)一使用sa-token鑒權(quán)。以上只是最基礎(chǔ)的網(wǎng)關(guān)統(tǒng)一鑒權(quán)的使用,更深層的比如內(nèi)外網(wǎng)隔離等請(qǐng)自行參考sa-token官網(wǎng)。個(gè)人覺得sa-token相當(dāng)牛逼,十分容易上手,不管你是單體、前后端分離還是微服務(wù)項(xiàng)目,都能輕松集成。相比于springsecurity學(xué)習(xí)成本降低很多。
另外本博客涉及的代碼已全部包含在文章里了,就不另外貼了。文章來源地址http://www.zghlxwxcb.cn/news/detail-693488.html

到了這里,關(guān)于【實(shí)現(xiàn)微服務(wù)集成satoken在網(wǎng)關(guān)gateway處統(tǒng)一鑒權(quán)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Gateway + Oauth2 + Jwt網(wǎng)關(guān)統(tǒng)一鑒權(quán)

    Spring Gateway + Oauth2 + Jwt網(wǎng)關(guān)統(tǒng)一鑒權(quán)

    之前文章里說過,分布式系統(tǒng)的鑒權(quán)有兩種方式,一是在網(wǎng)關(guān)進(jìn)行統(tǒng)一的鑒權(quán)操作,二是在各個(gè)微服務(wù)里單獨(dú)鑒權(quán)。 第二種方式比較常見,代碼網(wǎng)上也是很多。今天主要是說第一種方式。 重要前提:需要收集各個(gè)接口的uri路徑和所需權(quán)限列表的對(duì)應(yīng)關(guān)系,并存入緩存。 服務(wù)

    2024年02月03日
    瀏覽(24)
  • SpringCloud搭建微服務(wù)之Gateway+Jwt實(shí)現(xiàn)統(tǒng)一鑒權(quán)

    SpringCloud搭建微服務(wù)之Gateway+Jwt實(shí)現(xiàn)統(tǒng)一鑒權(quán)

    在微服務(wù)項(xiàng)目中,需要對(duì)整個(gè)微服務(wù)系統(tǒng)進(jìn)行權(quán)限校驗(yàn),通常有兩種方案,其一是每個(gè)微服務(wù)各自鑒權(quán),其二是在網(wǎng)關(guān)統(tǒng)一鑒權(quán),第二種方案只需要一次鑒權(quán)就行,避免了每個(gè)微服務(wù)重復(fù)鑒權(quán)的麻煩,本文以網(wǎng)關(guān)統(tǒng)一鑒權(quán)為例介紹如何搭建微服務(wù)鑒權(quán)項(xiàng)目。 本文案例中共有四

    2024年02月13日
    瀏覽(23)
  • 微服務(wù)-統(tǒng)一網(wǎng)關(guān)Gateway

    微服務(wù)-統(tǒng)一網(wǎng)關(guān)Gateway

    對(duì)用戶請(qǐng)求做身份認(rèn)證、權(quán)限校驗(yàn) 將用戶請(qǐng)求路由到微服務(wù),并實(shí)現(xiàn)負(fù)載均衡 對(duì)用戶請(qǐng)求做限流 創(chuàng)建新module,命名為Gateway,引入依賴(1.SpringCloudGateway依賴;2.Eureka客戶端依賴或者nacos的服務(wù)發(fā)現(xiàn)依賴)。在本案例中使用的是Eureka。 配置Application.yml的網(wǎng)關(guān)服務(wù) 路由id:路由

    2024年02月08日
    瀏覽(23)
  • 【微服務(wù)】八. 統(tǒng)一網(wǎng)關(guān)gateway

    【微服務(wù)】八. 統(tǒng)一網(wǎng)關(guān)gateway

    網(wǎng)關(guān)功能: 身份認(rèn)證和權(quán)限校驗(yàn) 服務(wù)路由、負(fù)載均衡 請(qǐng)求限流 網(wǎng)關(guān)的技術(shù)實(shí)現(xiàn) 在SpringCloud中網(wǎng)關(guān)的實(shí)現(xiàn)包括兩種: gateway zuul Zuul是基于Servlet的實(shí)現(xiàn),屬于阻塞式編程。而SpringCloudGateway則是基于Spring5中提供的WebFlux,屬于響應(yīng)式編程的實(shí)現(xiàn),具備更好的性能。 網(wǎng)關(guān)的作用 對(duì)

    2024年02月07日
    瀏覽(21)
  • 微服務(wù)中間件--統(tǒng)一網(wǎng)關(guān)Gateway

    微服務(wù)中間件--統(tǒng)一網(wǎng)關(guān)Gateway

    網(wǎng)關(guān)功能: 身份認(rèn)證和權(quán)限校驗(yàn) 服務(wù)路由、負(fù)載均衡 請(qǐng)求限流 網(wǎng)關(guān)的技術(shù)實(shí)現(xiàn) 在SpringCloud中網(wǎng)關(guān)的實(shí)現(xiàn)包括兩種: gateway zuul Zuul是基于Servlet的實(shí)現(xiàn),屬于阻塞式編程。而SpringCloudGateway則是基于Spring5中提供的WebFlux,屬于響應(yīng)式編程的實(shí)現(xiàn),具備更好的性能。 搭建網(wǎng)關(guān)服務(wù)

    2024年02月11日
    瀏覽(18)
  • Spring Cloud Gateway集成Swagger實(shí)現(xiàn)微服務(wù)接口文檔統(tǒng)一管理及登錄訪問

    Spring Cloud Gateway集成Swagger實(shí)現(xiàn)微服務(wù)接口文檔統(tǒng)一管理及登錄訪問

    本文將介紹如何在 Spring Cloud 微服務(wù)中使用 Swagger 網(wǎng)關(guān)來統(tǒng)一管理所有微服務(wù)的接口文檔,并通過 Spring Security 實(shí)現(xiàn)登錄后才能訪問 Swagger 文檔,以確保接口數(shù)據(jù)的安全訪問。 在開始之前,需要假設(shè)你已經(jīng)完成了 Spring Cloud Gateway 的相關(guān)配置,并且已經(jīng)了解了基本的網(wǎng)關(guān)配置知

    2024年02月05日
    瀏覽(38)
  • SpringCloud微服務(wù) 【實(shí)用篇】| 統(tǒng)一網(wǎng)關(guān)Gateway

    SpringCloud微服務(wù) 【實(shí)用篇】| 統(tǒng)一網(wǎng)關(guān)Gateway

    目錄 一:統(tǒng)一網(wǎng)關(guān)Gateway 1. 為什么需要網(wǎng)關(guān) 2. gateway快速入門 3. 斷言工廠 4. 過濾器工廠 5. 全局過濾器 6. 跨域問題 前面我們已經(jīng)學(xué)習(xí)了注冊(cè)中心Eureka、Nacos和配置管理中心Nacos;但是此時(shí)存在很多安全的問題,服務(wù)器擺在那里誰都可以進(jìn)行訪問! 網(wǎng)關(guān)功能: ① 身份認(rèn)證和權(quán)

    2024年02月04日
    瀏覽(20)
  • Spring Cloud Gateway + Oauth2 實(shí)現(xiàn)統(tǒng)一認(rèn)證和鑒權(quán)!

    Spring Cloud Gateway + Oauth2 實(shí)現(xiàn)統(tǒng)一認(rèn)證和鑒權(quán)!

    micro-oauth2-gateway:網(wǎng)關(guān)服務(wù),負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā)和鑒權(quán)功能,整合Spring Security+Oauth2; micro-oauth2-auth:Oauth2認(rèn)證服務(wù),負(fù)責(zé)對(duì)登錄用戶進(jìn)行認(rèn)證,整合Spring Security+Oauth2; micro-oauth2-api:受保護(hù)的API服務(wù),用戶鑒權(quán)通過后可以訪問該服務(wù),不整合Spring Security+Oauth2。 我們首先來搭建認(rèn)

    2024年01月16日
    瀏覽(23)
  • SpringCloud網(wǎng)關(guān)Gateway認(rèn)證鑒權(quán)【SpringCloud系列7】

    SpringCloud網(wǎng)關(guān)Gateway認(rèn)證鑒權(quán)【SpringCloud系列7】

    SpringCloud 大型系列課程正在制作中,歡迎大家關(guān)注與提意見。 程序員每天的CV 與 板磚,也要知其所以然,本系列課程可以幫助初學(xué)者學(xué)習(xí) SpringBooot 項(xiàng)目開發(fā) 與 SpringCloud 微服務(wù)系列項(xiàng)目開發(fā) 本文章是系列文章中的一篇 1、SpringCloud 項(xiàng)目基礎(chǔ)工程搭建 【SpringCloud系列1】 2、S

    2024年02月09日
    瀏覽(25)
  • 【Java】微服務(wù)——Gateway網(wǎng)關(guān)

    【Java】微服務(wù)——Gateway網(wǎng)關(guān)

    Gateway網(wǎng)關(guān)是我們服務(wù)的守門神,所有微服務(wù)的統(tǒng)一入口。 網(wǎng)關(guān)的 核心功能特性 : 請(qǐng)求路由 權(quán)限控制 限流 架構(gòu)圖: 權(quán)限控制 :網(wǎng)關(guān)作為微服務(wù)入口,需要校驗(yàn)用戶是是否有請(qǐng)求資格,如果沒有則進(jìn)行攔截。 路由和負(fù)載均衡 :一切請(qǐng)求都必須先經(jīng)過gateway,但網(wǎng)關(guān)不處理業(yè)

    2024年02月04日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包