Java SpringCloud 分布式鉴权 --Cookie携带token 作者:哇塞大嘴好帥(哇塞大嘴好帅)

Java SpringCloud 分布式鉴权 --Cookie携带token

​ 该鉴权思路为,前端登入账号如果账号密码正确后端返回前端jwt字符串,并且通过JavaScript讲返回的jwt保存到cookie里。以后每次通过网关进行访问都会经过网关拦截器判断是否登入、jwt是否过期。如果过期或者没有登入则跳转登入页面。

​ 这是我第一次发布博文,谢谢大家支持,如果我的文章不够详细,联系我的邮箱[email protected] 我远程帮助你
下期更新:Java SpringCloud 分布式鉴权 --使用Shiro安全框架共享Session方法

JWT工具类

package com.dazuizui.api.utils;

import com.dazuizui.api.pojo.User;
import com.sun.javafx.scene.traversal.Algorithm;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @author 哇塞大嘴好帅
 * @Time   2020/8/7 21:54
 * @Text   该工具类负责生成和解析JWT
 */
public class JwtUtil {
    /**
     * 生成或解析令牌时候所需要的密钥
     */
    private final static String JWTKey = "您的密钥";

    /**
     * 生成密文
     * @return
     */
    public static String createJWT(User user){
        //构建jwt令牌
        JwtBuilder builder = Jwts.builder();
        builder.setIssuer("颁发者"); //颁发者
        builder.setIssuedAt(new Date()); //颁发时间
        builder.setSubject("主题");   //主题
        builder.setExpiration(new Date(System.currentTimeMillis()+3600000));  //过期时间 设置3600秒

        //自定义信息 自定义载荷
        Map<String,Object> map = new HashMap<>();
        map.put("username","登入者昵称");
        builder.addClaims(map); //添加载荷

        builder.signWith(SignatureAlgorithm.HS256,JWTKey); //1.算法 2.密钥
        //生成密文
        String jstString = builder.compact();
        return jstString;
    }

    /**
     * 解析密钥
     * @param token 传入的token 并且从token解析的数据获取登入的用户名
     * @return
     */
    public static String analysisJWT(String token){
        System.out.println("获取到的"+token);
        Claims body = Jwts.parser()
                //密钥
                .setSigningKey(JWTKey)
                //要解析的令牌
                .parseClaimsJws(token)
                //获取解析后的数据
                .getBody();
        System.out.println(body.get("username"));
        return (String) body.get("username");
    }
}

网关编写 采用Gateway网关


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-gatewayartifactId>
    <version>2.2.3.RELEASEversion>
dependency>

使用网关的Filter做鉴权

package com.dazuizui.gateway.filter;

import com.dazuizui.api.utils.JwtUtil;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author 哇塞大嘴好帅
 * @blog   www.dazuizui.com
 * @Time   2020/7/11 21:05
 * @Text   DaZui_Blog项目的网关拦截器
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //跳转登入界面验证工具,如果为假就不跳转登入页面 如果跳转就跳转
        boolean goUrlHuser = false;
        //获取cookie
        MultiValueMap<String, HttpCookie> cookies = exchange.getRequest().getCookies();
        //获取url
        String url = exchange.getRequest().getURI().toString();
        //如果访问的url存在/huser/就需要鉴权
        if (url.contains("/huser/")){
            //存放token的值
            String tokenstr = "";

            //判断是否存在token记录
            if (cookies.getFirst("token") == null){
                System.out.println("[Filter] : 不存在token");
                goUrlHuser = true;
            }else{
                HttpCookie tokencookie = cookies.getFirst("token");
                tokenstr = tokencookie.getValue();
                System.out.println("接收到的token"+tokenstr);
            }

            //判断用户token是否过期或者恶意登入
            if (!goUrlHuser){
                String userdate = null;
                try {
                    userdate = JwtUtil.analysisJWT(tokenstr);
                } catch (Exception e) {
                    System.out.println("用户可能存在恶意登入或者登入token过期");
                    goUrlHuser = true;
                }
            }

            //如果没有登入或者token存在问题跳转登入页面
            if (goUrlHuser){
                //重定向到
                url = "http://127.0.0.1:8080/hlogin/index.html";
                System.out.println(url);
                exchange.getResponse().setStatusCode(HttpStatus.SEE_OTHER);
                exchange.getResponse().getHeaders().set(HttpHeaders.LOCATION,url);

                return exchange.getResponse().setComplete();
            }
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -10;
    }
}

校验账号密码是否正确

/**
 * 判断账号密码是否正确,如果正确跳转到重定向的界面,如果不正确跳转登入界面重新登入
 * @param username     账号
 * @param password     密码
 * @return
 */
@CrossOrigin
@PostMapping(value="/userlogin/ShiroLogin")
@ResponseBody
public String logim(@RequestParam("username") String username,@RequestParam("password") String password, HttpSession session, HttpServletResponse response) throws IOException {
    //判断账号密码是否正确
    if (username.equals("root") && password.equals("admin")) {
        String jwtstring = JwtUtil.createJWT(user);
   		return jwtstring;
    }else{
        return "false";
    }

}

前端部分




    
    
    
    
    
    
    
    登入
    
    



还没有账号?点击我注册

© 2020 - 2020  大嘴开发团队

js脚本语句

   //设置cookie
   function setCookie (name, value) {
        if (value) {
            var Days = 365
            var exp = new Date()
            exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000)
            document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString()+"; path=/";
        }
    }
    //获取cookie
    function  getCookie(NameOfCookie) {
                if (document.cookie.length > 0) {
                    begin = document.cookie.indexOf(NameOfCookie + "=");
                    if (begin !== -1) {
                        begin += NameOfCookie.length + 1;
                        end = document.cookie.indexOf(";", begin);
                        if (end === -1) end = document.cookie.length;
                        return unescape(document.cookie.substring(begin, end));
                    }
                }
                return null;
            }

    //获取url参数
    function getQueryVariable(variable)
    {
        var query = window.location.search.substring(1);
        var vars = query.split("&");
        for (var i=0;i<vars.length;i++) {
            var pair = vars[i].split("=");
            if(pair[0] == variable){return pair[1];}
        }
        return(false);
    }

你可能感兴趣的:(分布式鉴权,java,分布式,spring,boot,jwt,cloud)