SpringBoot es la implementación más simple de JWT

Que es JWT

Json web token (JWT), es un estándar abierto basado en JSON ((RFC 7519) que se implementa para pasar declaraciones entre entornos de aplicaciones web. Define un método conciso e independiente para comunicarse entre dos partes. La forma del objeto JSON puede transmitir información de forma segura. Debido a la existencia de firma digital, la información es confiable. JWT puede usar el algoritmo HMAC o un par de claves pública y privada RSA para firmar.

Sitio web oficial de JWT: https://jwt.io

Los principales escenarios de aplicación de JWT

Autenticación de identidad En este escenario, una vez que el usuario completa el inicio de sesión, el JWT se incluye en cada solicitud posterior, que se puede utilizar para verificar la identidad del usuario y para verificar los derechos de acceso de rutas, servicios y recursos. Debido a su pequeña sobrecarga, se puede transferir fácilmente en sistemas de diferentes nombres de dominio, y esta tecnología se usa actualmente ampliamente en el inicio de sesión único (SSO). Intercambio de información Es una forma muy segura de utilizar JWT para codificar datos entre las dos partes de la comunicación, dado que su información está firmada, puede garantizar que la información enviada por el remitente no sea falsificada.

Estructura JWT

JWT consta de tres partes:

Header 头部(标题包含了令牌的元数据,并且包含签名和/或加密算法的类型)
Payload 负载 (类似于飞机上承载的物品)
Signature 签名/签证

Estos tres textos de información están conectados entre sí para formar una cadena JWT.

Me gusta esto:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

A continuación, usamos springboot para realizar la generación de tokens jwt

La adición de dependencias pom necesitará usar json más adelante, así que las presentaremos juntas

 <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.51</version>
        </dependency>
    <dependency>

Agregue el controlador y las clases de entidad y servicio. Para la conveniencia de no operar la base de datos, usamos un nombre de usuario y contraseña fijos. El resultado general es el siguiente

Inserte la descripción de la imagen aquí

controlador

@RequestMapping("/user")
@RestController
public class UserController {
    
    

    @Autowired
    private UserService userService;

    @PostMapping(value = "/login")
    public String login(@RequestBody User user){
    
    
        return userService.login(user);
    }
}

Clase de implementación

public class UserServiceImpl implements UserService {
    
    
    public static final String USERNAME = "admin";
    public static final String PASSWORD = "admin";

    @Override
    public String login(User user) {
    
    
        //忽略查询数据库
        if (USERNAME.equals(user.getName()) && PASSWORD.equals(user.getPassword())){
    
    
            //创建用户令牌信息
            Map<String, Object> map = new HashMap<>();
            map.put("role","USER");
            map.put("success","SUCCESS");
            map.put("username",user.getName());
            //创建用户Token
            String token = JwtUtil.createJWT(UUID.randomUUID().toString(), JSON.toJSONString(map), null);
            //现在就可以存储tonken了,为了方便直接存到cookie里面去
            Cookie cookie = new Cookie("Authoriztion", token);
            cookie.setDomain("localhost");
            cookie.setPath("/");
            return token;
        }
        return "登录失败";
    }

    @Override
    public List<User> getUserInfo() {
    
    
        return null;
    }

}

La clase JwtUtil es el código de código principal de la siguiente manera, que encapsula la información para generar el token

public class JwtUtil {
    
    
    //令牌有效期 1小时
    public static final Long JWT_TTL = 3600000L;

    //jwt令牌信息
    public static final String JWT_KEY = "mzjmc";


    public static String createJWT(String id, String subject, Long ttlMillis){
    
    
        //指定签名算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //当前系统时间
        long currentTimeMillis = System.currentTimeMillis();
        //令牌签发的时间
        Date date = new Date(currentTimeMillis);
        //如果令牌的有效期为空则默认一小时
        if (ttlMillis == null){
    
    
            ttlMillis = JWT_TTL;
        }
        //令牌过期时间
        long expMillis = currentTimeMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        //生成秘钥
        SecretKey secretKey = generalKey();
        //封装jwt信息
        JwtBuilder jwtBuilder = Jwts.builder();
        jwtBuilder.setId(id); //唯一ID
        jwtBuilder.setSubject(subject); //主题信息
        jwtBuilder.setIssuer("admin");  //签发者
        jwtBuilder.setIssuedAt(date); //签发时间
        jwtBuilder.signWith(SignatureAlgorithm.HS256, secretKey); //算法及签名秘钥
        jwtBuilder.setExpiration(expDate);  //过期时间

        return jwtBuilder.compact();
    }

    /**
     * 生成秘钥
     * @return
     */
    public static SecretKey generalKey(){
    
    
        byte[] encode = Base64.getEncoder().encode(JWT_KEY.getBytes());
        return new SecretKeySpec(encode, 0, encode.length, "AES");
    }
}

A continuación, podemos probar para obtener información del token iniciando sesión. El nombre de usuario y la contraseña se especifican como administrador.

Primero viene el juego equivocado

Inserte la descripción de la imagen aquí

Otro juego de derechos

Inserte la descripción de la imagen aquí

¿No es simple, 2020-1024 todavía está muy feliz de celebrar el festival hoy?

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/mzjmc123/article/details/109262697
Recomendado
Clasificación