美文网首页
Java web中使用JWT

Java web中使用JWT

作者: 同德里苏大强 | 来源:发表于2019-04-06 23:30 被阅读0次
    jwt.png

    java-web 中使用 JWT 进行用户鉴权

    环境参数

    • springboot --1.4.7-release
    • springcloud--Camden.SR7
    • pom的配置我们不选择springbootparent方式,选择下面这种dependencies
    • 代码里用到了lambdaGoogle guava,这个要了解

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.mooc.house.user</groupId>
        <artifactId>user-srv</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>user-service</name>
        <description>User Service for house</description>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <springfox.version>2.2.2</springfox.version>
            <logbook.version>1.3.0</logbook.version>
            <start.class>com.mooc.house.user.UserSrvApplication</start.class>
        </properties>
        
       <dependencyManagement>
            <dependencies>
                <dependency>
                    <!-- Import dependency management from Spring Boot -->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>1.4.7.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                    <!--  我们一贯习惯以import的方式来导入sb和spring cloud,所以我们这里改变引入方式,将parent删除然后                      将sb import进来好了,一个拥有spring cloud的sping boot工程就创建好了那么引入spring cloud                      dependencies有什么好处呢,和spring boot dependencies一样,为我们进行版本管理,这里版本管理是                        组件的版本,它可以提供给我们一套兼容的组件;而无需我们关心版本也不用在pom中输入版本,比如我们这                        里的Eureka为例,我们无需输入版本号 -->
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Camden.SR7</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            </dependency>
           <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-sleuth</artifactId>
            </dependency>
            <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-zipkin</artifactId>
           </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            
            <dependency>
               <groupId>org.zalando</groupId>
              <artifactId>logbook-core</artifactId>
              <version>${logbook.version}</version>
            </dependency>
            <dependency>
                <groupId>org.zalando</groupId>
                <artifactId>logbook-servlet</artifactId>
                <version>${logbook.version}</version>
            </dependency>
            <dependency>
                <groupId>org.zalando</groupId>
                <artifactId>logbook-httpclient</artifactId>
                <version>${logbook.version}</version>
            </dependency>
            <dependency>
                <groupId>org.zalando</groupId>
                <artifactId>logbook-spring-boot-starter</artifactId>
                <version>${logbook.version}</version>
            </dependency>
            
            <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.2.0</version>
            </dependency>
            
            <dependency> <!-- exclude掉spring-boot的默认log配置 -->  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter</artifactId>  
            <exclusions>  
                <exclusion>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-starter-logging</artifactId>  
                </exclusion>  
               </exclusions>   
           </dependency>
    
            <dependency>
               <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-log4j2</artifactId>
           </dependency> 
           
            <dependency>
              <groupId>com.lmax</groupId>
              <artifactId>disruptor</artifactId>
              <version>3.3.6</version>
            </dependency>
        
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.0</version>
            </dependency>
        
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            
            <dependency>
               <groupId>com.google.guava</groupId>
               <artifactId>guava</artifactId>
               <version>18.0</version>
           </dependency>
           
            <dependency>
              <groupId>org.apache.commons</groupId>
              <artifactId>commons-lang3</artifactId>
              <version>3.4</version>
            </dependency>
            
             <dependency>
              <groupId>commons-beanutils</groupId>
              <artifactId>commons-beanutils</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
            </dependency>
            
            <dependency>
               <groupId>com.auth0</groupId>
               <artifactId>java-jwt</artifactId>
               <version>3.1.0</version>
             </dependency>
             
           <dependency>
            <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>
             <version>${springfox.version}</version>
           </dependency>
           
            <dependency>
            <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger-ui</artifactId>
             <version>${springfox.version}</version>
           </dependency>
              
          <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.24</version>
           </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
          </dependency>
        </dependencies>
    
        
    
        <build>
            <directory>${project.basedir}/target</directory>
            <outputDirectory>${project.build.directory}/classes</outputDirectory>
            <finalName>${project.artifactId}</finalName>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                <!-- 我们这里将spring boot maven插件完善一下,将启动类配置-->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>1.4.7.RELEASE</version>
                    <configuration>
                        <mainClass>com.mooc.house.user.UserServiceApplication</mainClass>
                        <layout>ZIP</layout>
                    </configuration>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>repackage</goal>
                                </goals>
                            </execution>
                        </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>2.4</version>
                    <executions>
                        <execution>
                            <id>attach-sources</id>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    
    

    JWT工具类

    package com.mooc.house.user.utils;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Date;
    import java.util.Map;
    
    import org.apache.commons.lang3.time.DateUtils;
    
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.JWTCreator;
    import com.auth0.jwt.JWTVerifier;
    import com.auth0.jwt.algorithms.Algorithm;
    import com.auth0.jwt.interfaces.Claim;
    import com.auth0.jwt.interfaces.DecodedJWT;
    import com.google.common.collect.Maps;
    
    public class JwtHelper {
      
      private static final String  SECRET = "session_secret";
      
      private static final String  ISSUER = "chunbo_user";
      
      //获取token的方法
      public static String genToken(Map<String, String> claims){
        try {
          //使用该加密算法
          Algorithm algorithm = Algorithm.HMAC256(SECRET);
          //Builder是JWTCreator的静态内部类
          //{静态内部类只能访问外部类的静态变量和静态方法,Outer.Inner inner = new Outer.Inner()}
          JWTCreator.Builder builder = JWT.create()
              .withIssuer(ISSUER) //设置发布者
              .withExpiresAt(DateUtils.addDays(new Date(), 1));//过期一天
          claims.forEach((k,v) -> builder.withClaim(k, v));//将传入的claims设置到builder里面
          //claims.forEach( builder::withClaim);
          return builder.sign(algorithm).toString(); //使用上面的加密算法进行签名,返回String,就是token
        } catch (IllegalArgumentException | UnsupportedEncodingException e) {
          throw new RuntimeException(e);
        }
      }
      //验证token方法
      public static Map<String, String> verifyToken(String token)  {
        Algorithm algorithm = null;
        try {
          algorithm = Algorithm.HMAC256(SECRET);
        } catch (IllegalArgumentException | UnsupportedEncodingException e) {
          throw new RuntimeException(e);
        }
        JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSUER).build();
        DecodedJWT jwt =  verifier.verify(token);
        Map<String, Claim> map = jwt.getClaims();
        Map<String, String> resultMap = Maps.newHashMap();
        map.forEach((k,v) -> resultMap.put(k, v.asString()));
        return resultMap;
      }
    
    }
    
     
    

    业务调用流程

    用户登录成功 —— JWT生成 token —— 第二次登录 ?token=xxxxx —— JWT鉴权vertify

    需要注意的是

    • JWT初始化,我们已经确定好过期时间,他无法在后面登出的时候,设置立即失效!
    • 所以我们可以引入中间层Redis,在生成token后,将email token绑定到Redis中 .

    相关文章

      网友评论

          本文标题:Java web中使用JWT

          本文链接:https://www.haomeiwen.com/subject/hvzdiqtx.html