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

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

這篇具有很好參考價值的文章主要介紹了SpringCloud搭建微服務(wù)之Gateway+Jwt實現(xiàn)統(tǒng)一鑒權(quán)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 概述

在微服務(wù)項目中,需要對整個微服務(wù)系統(tǒng)進行權(quán)限校驗,通常有兩種方案,其一是每個微服務(wù)各自鑒權(quán),其二是在網(wǎng)關(guān)統(tǒng)一鑒權(quán),第二種方案只需要一次鑒權(quán)就行,避免了每個微服務(wù)重復(fù)鑒權(quán)的麻煩,本文以網(wǎng)關(guān)統(tǒng)一鑒權(quán)為例介紹如何搭建微服務(wù)鑒權(quán)項目。
本文案例中共有四個微服務(wù)模塊,服務(wù)注冊中心、網(wǎng)關(guān)服務(wù)、鑒權(quán)服務(wù)和業(yè)務(wù)提供者
案例中使用組件版本號如下:

組件 版本
JDK 11
SpringBoot 2.7.9
SpringCloud 2021.0.6
Mybatis-Plus 3.5.3.1
jjwt 0.11.5

2. 鑒權(quán)微服務(wù)

新建一個SpringBoot項目,命名為springcloud-auth-server

2.1. 引入核心依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

2.2. 編寫JWT業(yè)務(wù)類

@Service
public class JwtService {

    private static final String SECRET = "JOE38R39GNGRTU49Y534YNIGEYR534YNDEUR7964GEUR735";

    public void validateToken(final String token) {
        Jwts.parserBuilder()
                .setSigningKey(getSignKey())
                .build()
                .parseClaimsJws(token);
    }

    public String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username);
    }

    private String createToken(Map<String, Object> claims, String username) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(username)
                .setIssuedAt(new Date(Instant.now().toEpochMilli()))
                .setExpiration(new Date(Instant.now().toEpochMilli() + 1000 * 30 * 60))
                .signWith(getSignKey(), SignatureAlgorithm.HS256)
                .compact();
    }

    private Key getSignKey() {
        byte[] keyBytes = Decoders.BASE64.decode(SECRET);
        return Keys.hmacShaKeyFor(keyBytes);
    }
}

2.3. 編寫配置類

@Configuration
@EnableWebSecurity
public class AuthConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf()
                .disable()
                .authorizeHttpRequests()
                .antMatchers("/auth/register", "/auth/token", "/auth/validate").permitAll();
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        return new CustomUserDetailsService();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

    @Bean
    public AuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setUserDetailsService(userDetailsService());
        authenticationProvider.setPasswordEncoder(passwordEncoder());
        return authenticationProvider;
    }
}

2.4. 編寫Security用戶認證

新建CustomUserDetails類實現(xiàn)UserDetails接口

public class CustomUserDetails implements UserDetails {

    private String username;
    private String password;

    public CustomUserDetails(UserCredential userCredential) {
        this.username = userCredential.getUsername();
        this.password = userCredential.getPassword();
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

編寫CustomUserDetailsService類實現(xiàn)UserDetailsService接口

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private AuthService authService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<UserCredential> credential = authService.findUserByUsername(username);
        return credential.map(CustomUserDetails::new).orElseThrow(() -> new UsernameNotFoundException("user not found"));
    }
}

說明:文中用到的用戶認證類UserCredential只有用戶名和密碼字段,實體類、持久層接口和業(yè)務(wù)類接口都比較簡單,文中就不一一列舉

2.5. 編寫權(quán)限Controller類

@RestController
@RequestMapping(value = "/auth")
public class AuthController {

    @Autowired
    private AuthService authService;
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    private JwtService jwtService;
    @Autowired
    private AuthenticationManager authenticationManager;

    @PostMapping(value = "/register")
    public ResponseEntity createUser(@RequestBody UserCredential credential) {
        credential.setPassword(passwordEncoder.encode(credential.getPassword()));
        authService.save(credential);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    @PostMapping(value = "/token")
    public ResponseEntity<String> generateToken(@RequestBody AuthRequest authRequest) {
        final Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword()));
        if (authenticate.isAuthenticated()) {
            final String token = jwtService.generateToken(authRequest.getUsername());
            return ResponseEntity.status(HttpStatus.OK).body(token);
        } else {
            throw new RuntimeException("invalid access");
        }
    }

    @GetMapping(value = "/validate")
    public ResponseEntity validateToken(@RequestParam String token) {
        jwtService.validateToken(token);
        return ResponseEntity.status(HttpStatus.ACCEPTED).build();
    }
}

3. 網(wǎng)關(guān)微服務(wù)

新建一個SpringBoot項目,命名為springcloud-gateway

3.1. 引入核心依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>${jjwt.version}</version>
</dependency>

3.2. 編寫權(quán)限過濾器類

@Component
public class AuthenticationFilter extends AbstractGatewayFilterFactory<AuthenticationFilter.Config> {

    @Autowired
    private RouteValidator validator;

    public AuthenticationFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return ((exchange, chain) -> {
            if (validator.isSecured.test(exchange.getRequest())) {
                if (!exchange.getRequest().getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
                    throw new RuntimeException("missing authorization header");
                }
                String authHeader = exchange.getRequest().getHeaders().get(HttpHeaders.AUTHORIZATION).get(0);
                if (null != authHeader && authHeader.startsWith("Bearer ")) {
                    authHeader = authHeader.substring(7);
                }
                try {
                    JwtUtil.validateToken(authHeader);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException("un authorized access to application");
                }
            }
            return chain.filter(exchange);
        });
    }

    public static class Config {

    }
}

3.3. 編寫application.yml配置

spring:
  application:
    name: CLOUD-GATEWAY
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: provider_routh
          uri: lb://CLOUD-PROVIDER-SERVER
          predicates:
            - Path=/provider/server/**
          filters:
            - AuthenticationFilter
        - id: auth_routh
          uri: lb://CLOUD-AUTH-SERVER
          predicates:
            - Path=/auth/**

4. 測試

依次啟動注冊中心服務(wù)、網(wǎng)關(guān)服務(wù)、鑒權(quán)服務(wù)和業(yè)務(wù)提供服務(wù)
postman發(fā)起post請求http://localhost:8000/auth/token獲取token
spring cloud gateway 權(quán)限驗證,SpringCloud,spring cloud,微服務(wù),gateway,統(tǒng)一鑒權(quán)
postman發(fā)起get請求http://localhost:8000/provider/server/info,將上面獲取的token攜帶上,如下配置
spring cloud gateway 權(quán)限驗證,SpringCloud,spring cloud,微服務(wù),gateway,統(tǒng)一鑒權(quán)
Type類型選擇No Auth,再次發(fā)起請求
spring cloud gateway 權(quán)限驗證,SpringCloud,spring cloud,微服務(wù),gateway,統(tǒng)一鑒權(quán)
查看后臺日志會發(fā)現(xiàn)是因為沒有token
spring cloud gateway 權(quán)限驗證,SpringCloud,spring cloud,微服務(wù),gateway,統(tǒng)一鑒權(quán)
說明:本文只是簡單實現(xiàn)了gateway實現(xiàn)統(tǒng)一鑒權(quán)功能,有些地方還需要小伙伴自行優(yōu)化,例如沒有token異常提示可以返回給前端文章來源地址http://www.zghlxwxcb.cn/news/detail-537792.html

到了這里,關(guān)于SpringCloud搭建微服務(wù)之Gateway+Jwt實現(xiàn)統(tǒng)一鑒權(quán)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Spring Gateway使用JWT實現(xiàn)統(tǒng)一身份認證

    Spring Gateway使用JWT實現(xiàn)統(tǒng)一身份認證

    在開發(fā)集群式或分布式服務(wù)時,鑒權(quán)是最重要的一步,為了方便對請求統(tǒng)一鑒權(quán),一般都是會放在網(wǎng)關(guān)中進行處理。目前非常流行的一種方案是使用JWT,詳細的使用說明,可以找相關(guān)的資料查閱,這里先不進行深入的引用了。主要使用它下面的特性: 它的數(shù)據(jù)使用JSON格式封

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

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

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

    2024年01月16日
    瀏覽(23)
  • 【實現(xiàn)微服務(wù)集成satoken在網(wǎng)關(guān)gateway處統(tǒng)一鑒權(quán)】

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

    本文旨在使用開源輕量級 Java 權(quán)限認證框架sa-token+springcloud-gateway實現(xiàn)微服務(wù)在網(wǎng)關(guān)處統(tǒng)一鑒權(quán)。sa-token參考地址:https://sa-token.cc/doc.html#/ 項目按照業(yè)務(wù)分為三個板塊,如圖: api(也就是微服務(wù)中各種api接口,不涉及任何權(quán)限相關(guān)代碼,只提供服務(wù)) auth(認證中心,實現(xiàn)登陸邏輯

    2024年02月10日
    瀏覽(18)
  • 5.微服務(wù)項目實戰(zhàn)---Gateway--服務(wù)網(wǎng)關(guān),實現(xiàn)統(tǒng)一認證、鑒權(quán)、監(jiān)控、路由轉(zhuǎn)發(fā)等

    5.微服務(wù)項目實戰(zhàn)---Gateway--服務(wù)網(wǎng)關(guān),實現(xiàn)統(tǒng)一認證、鑒權(quán)、監(jiān)控、路由轉(zhuǎn)發(fā)等

    大家都都知道在微服務(wù)架構(gòu)中,一個系統(tǒng)會被拆分為很多個微服務(wù)。那么作為客戶端要如何去調(diào)用 這么多的微服務(wù)呢?如果沒有網(wǎng)關(guān)的存在,我們只能在客戶端記錄每個微服務(wù)的地址,然后分別去調(diào)用。 ? 這樣的架構(gòu),會存在著諸多的問題: 客戶端多次請求不同的微服務(wù),

    2024年02月16日
    瀏覽(25)
  • SpringCloud gateway+Spring Security + JWT實現(xiàn)登錄和用戶權(quán)限校驗

    SpringCloud gateway+Spring Security + JWT實現(xiàn)登錄和用戶權(quán)限校驗

    原本打算將Security模塊與gateway模塊分開寫的,但想到gateway本來就有過濾的作用 ,于是就把gateway和Security結(jié)合在一起了,然后結(jié)合JWT令牌對用戶身份和權(quán)限進行校驗。 Spring Cloud的網(wǎng)關(guān)與傳統(tǒng)的SpringMVC不同,gateway是基于Netty容器,采用的webflux技術(shù),所以gateway模塊不能引入spri

    2024年02月03日
    瀏覽(24)
  • GateWay網(wǎng)關(guān)自定義過濾器實現(xiàn)token校驗完成統(tǒng)一鑒權(quán)

    GateWay網(wǎng)關(guān)自定義過濾器實現(xiàn)token校驗完成統(tǒng)一鑒權(quán)

    gateWay---API網(wǎng)關(guān),也可以稱為業(yè)務(wù)網(wǎng)關(guān),主要服務(wù)于微服務(wù)的; (1)? 三大組件 路由(Route) ????????構(gòu)建網(wǎng)關(guān)的基本模塊,由id(唯一標示)、目標URI、一組斷言、一組過濾器組成,如果斷言為true,則匹配該路由 ? 斷言(Predicate) ? ? ? ? ?可以使用它匹配來自HTTP請求的任何

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

    SpringCloud微服務(wù) 【實用篇】| 統(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í)了注冊中心Eureka、Nacos和配置管理中心Nacos;但是此時存在很多安全的問題,服務(wù)器擺在那里誰都可以進行訪問! 網(wǎng)關(guān)功能: ① 身份認證和權(quán)

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

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

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

    2024年02月05日
    瀏覽(38)
  • 【SpringCloud】11、Spring Cloud Gateway使用Sentinel實現(xiàn)服務(wù)限流

    1、關(guān)于 Sentinel Sentinel 是阿里巴巴開源的一個流量防衛(wèi)防護組件,可以為微服務(wù)架構(gòu)提供強大的流量防衛(wèi)能力,包括流量控制、熔斷降級等功能。Spring Cloud Gateway 與 Sentinel 結(jié)合,可以實現(xiàn)強大的限流功能。 Sentinel 具有以下特性: 豐富的應(yīng)用場景:Sentinel 承接了阿里巴巴近

    2024年02月01日
    瀏覽(23)
  • springboot和flask整合nacos,使用openfeign實現(xiàn)服務(wù)調(diào)用,使用gateway實現(xiàn)網(wǎng)關(guān)的搭建(附帶jwt續(xù)約的實現(xiàn))

    springboot和flask整合nacos,使用openfeign實現(xiàn)服務(wù)調(diào)用,使用gateway實現(xiàn)網(wǎng)關(guān)的搭建(附帶jwt續(xù)約的實現(xiàn))

    插件 版本 jdk 21 springboot 3.0.11 springcloud 2022.0.4 springcloudalibaba 2022.0.0.0 nacos 2.2.3(穩(wěn)定版) python 3.8 先創(chuàng)建目錄,分別創(chuàng)建config,logs,data目錄,單獨創(chuàng)建一個容器 ?將配置文件拷貝出來(主要是application.properties和logback.xml) 修改mysql的信息(修改文件application.properties) 再次運行

    2024年02月07日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包