《项目实战》构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)

03-03 7102阅读 0评论

系列文章目录

构建SpringCloud alibaba项目(一、构建父工程、公共库、网关)

构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)

《项目实战》构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service) 第1张


文章目录

  • 系列文章目录
  • 前言
  • 1、在公共库增加 UserInfo类
  • 2、微服务鉴权子工程store-authority-service
    • 2.1、创建子工程store-authority-service
    • 2.2、修改pom.xml配置
    • 2.3、修改application.yml配置
    • 2.4、配置JWT
    • 2.5、编写JWT测试类
      • 2.5.1、运行结果
      • 2.6、对外发布鉴权API - AuthController
      • 总结

        前言

        构建微服务鉴权子工程store-authority-service,集成JWT,提供权限验证功能。


        1、在公共库增加 UserInfo类

        微服务鉴权子工程,需要用到用户信息类,存放在JWT生成的Token信息里。

        package com.kelvin.common.entity;
        import lombok.Data;
        /***
         * @title UserInfo
         * @desctption 
         * @author Administrator
         * @create 2023/6/19 17:05
         **/
        @Data
        public class UserInfo {
            private long id;
            private String userAccount;
            private String userName;
            private String pwd;
        }
        

        2、微服务鉴权子工程store-authority-service

        2.1、创建子工程store-authority-service

        创建Module,store-authority-service

        2.2、修改pom.xml配置

        加入依赖:springboot、JWT、nacos-discovery、公共库等

            4.0.0
            
                com.kelvin
                onlinestore
                1.0-SNAPSHOT
            
            store-authority-service
            jar
            authority-service
            http://maven.apache.org
            
                UTF-8
            
            
                
                    io.jsonwebtoken
                    jjwt
                    0.7.0
                
                
                    com.auth0
                    java-jwt
                    3.4.0
                
                
                    com.alibaba.cloud
                    spring-cloud-starter-alibaba-nacos-discovery
                
                
                    org.springframework.boot
                    spring-boot-starter-web
                
                
                    org.springframework.boot
                    spring-boot-devtools
                    runtime
                    true
                
                
                    org.springframework.boot
                    spring-boot-autoconfigure
                
                
                    com.kelvin
                    store-common
                
                
                    com.google.code.gson
                    gson
                    2.7
                
           
            
        
        

        2.3、修改application.yml配置

        server:
          port: 7777
        spring:
          application:
            name: store-auth-service
          cloud:
            nacos:
              discovery:
                server-addr: localhost:8848  #Nacos server 的地址
        config:
          jwt:
            # 加密密钥
            secret: kelvin
            # token有效时长
            expire: 200
            # header 名称
            header: token
        

        2.4、配置JWT

        package com.kelvin.authority.config;
        /***
         * @title JwtConfig
         * @desctption JWT配置类
         * @author kelvin
         * @create 2023/6/8 9:39
         **/
        import io.jsonwebtoken.Claims;
        import io.jsonwebtoken.Jwts;
        import io.jsonwebtoken.SignatureAlgorithm;
        import lombok.Data;
        import org.springframework.boot.context.properties.ConfigurationProperties;
        import org.springframework.stereotype.Component;
        import java.util.Date;
        @Component
        @ConfigurationProperties(prefix = "config.jwt")
        @Data
        public class JwtConfig {
            /**
             * 密钥
             */
            private String secret;
            /**
             * 过期时间
             */
            private Long expire;
            /**
             * 头部
             */
            private String header;
            /**
             * 生成token
             * @param subject
             * @return
             */
            public String createToken(String subject){
                Date nowDate = new Date();
                Date expireDate = new Date(nowDate.getTime() + expire * 1000);
                return Jwts.builder()
                        .setHeaderParam("typ","JWT")
                        .setSubject(subject)
                        .setIssuedAt(nowDate)
                        .setExpiration(expireDate)
                        .signWith(SignatureAlgorithm.HS512,secret)
                        .compact();
            }
            /**
             * 获取token中的注册信息
             * @param token
             * @return
             */
            public Claims getTokenClaim(String token){
                try{
                    return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
                }catch (Exception e){
                    return null;
                }
            }
            /**
             * 验证token是否过期
             * @param expirationTime
             * @return
             */
            public boolean isTokenExpired(Date expirationTime){
                if(null == expirationTime){
                    return true;
                }else{
                    return expirationTime.before(new Date());
                }
            }
            /**
             * 获取token的失效时间
             * @param token
             * @return
             */
            public Date getExpirationDateFromToken(String token){
                Claims tokenClaim = this.getTokenClaim(token);
                if(tokenClaim == null){
                    return null;
                }else{
                    return this.getTokenClaim(token).getExpiration();
                }
            }
            /**
             * 获取token中的用户名
             * @param token
             * @return
             */
            public String getUserNameFromToken(String token){
                return this.getTokenClaim(token).getSubject();
            }
            /**
             * 获取token中发布时间
             * @param token
             * @return
             */
            public Date getIssuedDateFromToken(String token){
                return this.getTokenClaim(token).getIssuedAt();
            }
        }
        

        2.5、编写JWT测试类

        package com.kelvin.authority.test;
        import com.google.gson.Gson;
        import com.kelvin.authority.config.JwtConfig;
        import com.kelvin.common.entity.UserInfo;
        /***
         * @title JwtMain
         * @desctption JWT本地测试类
         * @author Administrator
         * @create 2023/6/8 15:04
         **/
        public class JwtMain {
            public static void main(String[] args) {
                JwtConfig jwtConfig = new JwtConfig();
                jwtConfig.setExpire(10L);
                jwtConfig.setSecret("kelvin");
                jwtConfig.setHeader("token");
                UserInfo userInfo = new UserInfo();
                userInfo.setId(10000000001L);
                userInfo.setUserAccount("zhangsan");
                userInfo.setUserName("张三");
                String token = jwtConfig.createToken(new Gson() .toJson(userInfo));
                System.out.println("token: " + token);
                boolean aBoolean = jwtConfig.isTokenExpired(jwtConfig.getExpirationDateFromToken(token));
                System.out.println("aBoolean: " + aBoolean);
                System.out.println( "user: " +   jwtConfig.getUserNameFromToken(token));
            }
        }
        

        2.5.1、运行结果

        token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ7XCJpZFwiOjEwMDAwMDAwMDAxLFwidXNlckFjY291bnRcIjpcInpoYW5nc2FuXCIsXCJ1c2VyTmFtZVwiOlwi5byg5LiJXCJ9IiwiaWF0IjoxNjg3MTY2MTc1LCJleHAiOjE2ODcxNjYxODV9.KZz-WrpslG3MOKyVd_9MXofCMh3STOvR3IwseRslreuYAS56UGuBBV6qVkHErLxxy3ELlRkWpiPZBj5eyFn2fw
        aBoolean: false
        user: {"id":10000000001,"userAccount":"zhangsan","userName":"张三"}
        

        2.6、对外发布鉴权API - AuthController

        • 提供【登录】接口,返回token信息
        • 提供【token是否过期】接口,返回是否过期
          package com.kelvin.authority.controller;
          /***
           * @title AuthController
           * @desctption 用户鉴权API
           * @author Kelvin
           * @create 2023/6/8 9:40
           **/
          import com.kelvin.authority.config.JwtConfig;
          import com.kelvin.common.dto.TokenDTO;
          import com.kelvin.common.entity.UserInfo;
          import com.kelvin.common.http.HttpResultGenerator;
          import com.kelvin.common.http.ResultDTO;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.web.bind.annotation.*;
          import java.util.HashMap;
          import java.util.Map;
          @CrossOrigin("*")
          @RestController
          @RequestMapping("/auth")
          public class AuthController {
              @Autowired
              private JwtConfig jwtConfig;
              @PostMapping("/login")
              public ResultDTO login(@RequestBody UserInfo userInfo){
                  String token = jwtConfig.createToken(userInfo.getUserAccount());
                  Map map = new HashMap();
                  map.put("token",token);
                  return HttpResultGenerator.success(map);
              }
              /**
               * token是否过期
               * @param token
               * @return
               */
              @PostMapping("/isTokenExpiration")
              public Boolean isTokenExpiration(@RequestBody TokenDTO token){
                  return this.jwtConfig.isTokenExpired(this.jwtConfig.getExpirationDateFromToken(token.getToken()));
              }
          }
          

          总结

          以上就是今天要讲的内容,本文简单介绍了JWT的使用,对外提供提供【登录接口】、【token是否过期接口】,为分布式系统提供鉴权微服务功能。


免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,7102人围观)

还没有评论,来说两句吧...

目录[+]