Inhaltsverzeichnis
Einführung in JWT
Warum JWT verwenden?
Was sind die Nachteile der herkömmlichen Sitzungsauthentifizierung?
Vorteile der JWT-Authentifizierung
Datenstruktur von JWT
Header
Payload
Signatur
Spring Boot integriert JWT
Einführung des Jwt-Pakets
JWT-Toolklasse schreiben
Token-Authentifizierungs-Interceptor
Konfigurations-Interceptor
Anmeldeüberprüfungsprozess
Beispielcode
Heim Java javaLernprogramm Wie integriert Spring Boot JWT, um eine Front-End- und Back-End-Authentifizierung zu erreichen?

Wie integriert Spring Boot JWT, um eine Front-End- und Back-End-Authentifizierung zu erreichen?

May 18, 2023 pm 01:19 PM
jwt springboot

Einführung in JWT

JWT (vollständiger Name: Json Web Token) ist ein offener Standard (RFC 7519), der eine kompakte, eigenständige Möglichkeit zur sicheren Übertragung von Informationen zwischen Parteien als JSON-Objekt definiert.

Warum JWT verwenden?

Was sind die Nachteile der herkömmlichen Sitzungsauthentifizierung?

  • Die Anmeldeinformationen jedes Benutzers werden in der Sitzung des Servers gespeichert. Mit zunehmender Anzahl von Benutzern steigt der Serveraufwand erheblich.

  • Sitzungsinformationen werden im Speicher des Servers gespeichert, was bei verteilten Anwendungen zu Fehlern führt. Obwohl die Sitzungsinformationen einheitlich im Redis-Cache gespeichert werden können, kann dies die Komplexität erhöhen.

  • Da die Sitzungsauthentifizierung auf Cookies basiert, ist sie nicht auf Nicht-Browser- und mobile Endgeräte anwendbar.

  • Das Front-End- und Back-End-Trennsystem, da Front-End und Back-End domänenübergreifend sind und Cookie-Informationen nicht gekreuzt werden können, sodass die Sitzungsauthentifizierung die domänenübergreifende Authentifizierung nicht fortsetzen kann.

Vorteile der JWT-Authentifizierung

  • Einfach: Das Datenvolumen des JWT-Tokens ist gering und die Übertragungsgeschwindigkeit ist ebenfalls sehr hoch.

  • Sprachübergreifend: JWT-Token wird auf dem Client in JSON-verschlüsselter Form gespeichert, sodass JWT sprachübergreifend ist und von jedem Webformular unterstützt wird. Plattformübergreifend: Verlässt sich nicht auf Cookies und Sitzungen und muss keine Sitzungsinformationen auf dem Server speichern. Es eignet sich sehr gut für verteilte Anwendungen und kann zur Erweiterung verwendet werden.

Datenstruktur von JWT

Wie integriert Spring Boot JWT, um eine Front-End- und Back-End-Authentifizierung zu erreichen?

Der erste Teil von JWT ist der Header-Teil, bei dem es sich um ein Json-Objekt handelt, das die JWT-Metadaten beschreibt, normalerweise wie unten gezeigt.

{
    "alg": "HS256",
    "typ": "JWT"
}
Nach dem Login kopieren

Das alg-Attribut gibt den für die Signatur verwendeten Algorithmus an, der Standardwert ist HMAC SHA256 (geschrieben als HS256), das typ-Attribut gibt den Typ des Tokens an und JWT-Tokens werden einheitlich als JWT geschrieben.

Payload

Der zweite Teil von JWT ist Payload, bei dem es sich ebenfalls um ein Json-Objekt handelt. Zusätzlich zu den zu übergebenden Daten stehen sieben Standardfelder zur Auswahl. iss: Issuer exp: Ablaufzeit sub: Subject aud: User nbf: Nicht verfügbar vor iat: Release-Zeit jti: Die JWT-ID wird verwendet, um dieses JWT zu identifizieren

{
    //默认字段
    "sub":"主题123",
    //自定义字段
    "name":"java",
    "isAdmin":"true",
    "loginTime":"2021-12-05 12:00:03"
}
Nach dem Login kopieren

Es ist wichtig zu beachten, dass JWT standardmäßig unverschlüsselt ist, das kann jeder Entschlüsseln Sie den Inhalt. Wenn also vertrauliche Informationen hier nicht gespeichert sind, können Sie Informationslecks verhindern. Auch JSON-Objekte werden mithilfe des Base64-URL-Algorithmus in Strings umgewandelt und gespeichert.

Signatur

Der Signatur-Hash-Teil besteht darin, die beiden oben genannten Datenteile zu signieren. Er muss Base64-codierte Header- und Nutzdaten verwenden und über den angegebenen Algorithmus einen Hash generieren, um sicherzustellen, dass die Daten nicht manipuliert werden.

Spring Boot integriert JWT

Einführung des Jwt-Pakets

<dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
  </dependency>
Nach dem Login kopieren

JWT-Toolklasse schreiben

public class JwtUtil
{
//创建jwt
public static String createJWT(String subject, String issue, Object claim,
            long ttlMillis)
    {
       //当前时间
        long nowMillis = System.currentTimeMillis();
        //过期时间
        long expireMillis = nowMillis + ttlMillis;
        String result = Jwts.builder()
                .setSubject(subject) //设置主题
                .setIssuer(issue) //发行者
                .setId(issue)//jwtID
                .setExpiration(new Date(expireMillis)) //设置过期日期
                .claim("user", claim)//主题,可以包含用户信息
                .signWith(getSignatureAlgorithm(), getSignedKey())//加密算法
                .compressWith(CompressionCodecs.DEFLATE).compact();//对载荷进行压缩

        return result;
    }
    
    // 解析jwt
    public static Jws<Claims> pareseJWT(String jwt)
    {
        Jws<Claims> claims;
        try
        {
            claims = Jwts.parser().setSigningKey(getSignedKey())
                    .parseClaimsJws(jwt);
        }
        catch (Exception ex)
        {
            claims = null;
        }
        return claims;
    }

   //获取主题信息
    public static Claims getClaims(String jwt)
    {
        Claims claims;
        try
        {
            claims = Jwts.parser().setSigningKey(getSignedKey())
                    .parseClaimsJws(jwt).getBody();
        }
        catch (Exception ex)
        {
            claims = null;
        }
        return claims;
    }
  }
  
   /**
     * 获取密钥
     * 
     * @return Key
     */
    private static Key getSignedKey()
    {
        byte[] apiKeySecretBytes = DatatypeConverter
                .parseBase64Binary(getAuthKey());
        Key signingKey = new SecretKeySpec(apiKeySecretBytes,
                getSignatureAlgorithm().getJcaName());
        return signingKey;
    }
    
    private static SignatureAlgorithm getSignatureAlgorithm()
    {
        return SignatureAlgorithm.HS256;
    }
  
  //获取密钥,可以动态配置
  public static String getAuthKey()
  {
        String auth = "123@#1234";
  }
Nach dem Login kopieren

Token-Authentifizierungs-Interceptor

 Component
public class TokenInterceptor extends HandlerInterceptorAdapter
{
    public static Log logger = LogManager.getLogger(TokenInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception
    {
        String uri = request.getRequestURI();
        logger.info("start TokenInterceptor preHandle.." + uri);
         
		//需要过滤特殊请求
        if (SystemUtil.isFree(uri) || SystemUtil.isProtected(uri))
        {
            return true;
        }
        
		
        String metohd=request.getMethod().toString();
        logger.info("TokenInterceptor request method:"+metohd);
        //options 方法需要过滤
        if("OPTIONS".equals(metohd))
        {
            return true;   
        }
        
		//是否开启token认证
        boolean flag = SystemUtil.getVerifyToken();
        ResponseResult result = new ResponseResult();
		//从请求的head信息中获取token
        String token = request.getHeader("X-Token");

        if (flag)
        {
            if(StringUtils.isEmpty(token))
            {
                token=request.getParameter("X-Token");    
            }
            // token不存在
            if (StringUtils.isEmpty(token))
            {
                result.setCode(ResultCode.NEED_AUTH.getCode());
                result.setMsg(ResultCode.NEED_AUTH.getMsg());
                WebUtil.writeJson(result, response);
                return false;
            }
            else
            {
                Claims claims = JwtUtil.getClaims(token);
                String subject = "";
                if (claims != null)
                {
                    subject = claims.getSubject();
                    // 验证主题
                    if (StringUtils.isEmpty(subject))
                    {
                        result.setCode(ResultCode.INVALID_TOKEN.getCode());
                        result.setMsg(ResultCode.INVALID_TOKEN.getMsg());
                        WebUtil.writeJson(result, response);
                        return false;
                    }								
                }
                else
                {
                    result.setCode(ResultCode.INVALID_TOKEN.getCode());
                    result.setMsg(ResultCode.INVALID_TOKEN.getMsg());
                    WebUtil.writeJson(result, response);
                    return false;
                }
            }
        }
        return true;
    }

}
Nach dem Login kopieren

Konfigurations-Interceptor

@Configuration
public class WebConfig implements WebMvcConfigurer
{
    @Resource
    private TokenInterceptor tokenInterceptor;

    public void addInterceptors(InterceptorRegistry registry)
    {
        registry.addInterceptor(tokenInterceptor).addPathPatterns("/**");
    }
 }
Nach dem Login kopieren

Anmeldeüberprüfungsprozess

Wie integriert Spring Boot JWT, um eine Front-End- und Back-End-Authentifizierung zu erreichen?

Beispielcode

@RequestMapping("login")
public Result login(HttpServletResponse response)
{
    Map<String, Object> map = new HashMap<>();
    //
    Result result = loginAuth(user);
    int code = result.getCode();
            //登录认证成功
    if (code ==ResultCode.SUCCESS)
    {
        //默认为7天
        Long ttlMillis = 7*1000 * 60 * 60 * 24;
        //过期时间
        long expreTime = System.currentTimeMillis() + ttlMillis;
        String tokenKey = UUID.randomUUID().toString();
        String tokenId = JwtUtil.createJWT(user.getUserId(), tokenKey,
                user.getPassword(), expreTime);                   
        map.put("expreTime", expreTime);				
        map.put("tokenId", tokenId);           
    }
    else
    {
        logger.error("login error:" +FastJsonUtil.toJSONString(result));
    }
    return result;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie integriert Spring Boot JWT, um eine Front-End- und Back-End-Authentifizierung zu erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie Springboot Jasypt integriert, um die Verschlüsselung von Konfigurationsdateien zu implementieren Wie Springboot Jasypt integriert, um die Verschlüsselung von Konfigurationsdateien zu implementieren Jun 01, 2023 am 08:55 AM

Einführung in Jasypt Jasypt ist eine Java-Bibliothek, die es einem Entwickler ermöglicht, seinem Projekt mit minimalem Aufwand grundlegende Verschlüsselungsfunktionen hinzuzufügen und kein tiefes Verständnis der Funktionsweise der Verschlüsselung erfordert. standardbasierte Verschlüsselungstechnologie. Passwörter, Text, Zahlen, Binärdateien verschlüsseln ... Geeignet für die Integration in Spring-basierte Anwendungen, offene API, zur Verwendung mit jedem JCE-Anbieter ... Fügen Sie die folgende Abhängigkeit hinzu: com.github.ulisesbocchiojasypt-spring-boot-starter2 Die Vorteile von Jasypt schützen unsere Systemsicherheit. Selbst wenn der Code durchgesickert ist, kann die Datenquelle garantiert werden.

So implementieren Sie verteilte Sperren mit Redis in SpringBoot So implementieren Sie verteilte Sperren mit Redis in SpringBoot Jun 03, 2023 am 08:16 AM

1. Redis implementiert das Prinzip der verteilten Sperren und warum verteilte Sperren erforderlich sind. Bevor über verteilte Sperren gesprochen wird, muss erläutert werden, warum verteilte Sperren erforderlich sind. Das Gegenteil von verteilten Sperren sind eigenständige Sperren. Wenn wir Multithread-Programme schreiben, vermeiden wir Datenprobleme, die durch den gleichzeitigen Betrieb einer gemeinsam genutzten Variablen verursacht werden. Normalerweise verwenden wir eine Sperre, um die Richtigkeit der gemeinsam genutzten Variablen sicherzustellen Die gemeinsam genutzten Variablen liegen im gleichen Prozess. Wenn es mehrere Prozesse gibt, die gleichzeitig eine gemeinsam genutzte Ressource betreiben müssen, wie können sie sich dann gegenseitig ausschließen? Heutige Geschäftsanwendungen sind in der Regel Microservice-Architekturen, was auch bedeutet, dass eine Anwendung mehrere Prozesse bereitstellen muss. Wenn mehrere Prozesse dieselbe Datensatzzeile in MySQL ändern müssen, ist eine Verteilung erforderlich, um fehlerhafte Daten zu vermeiden wird zu diesem Zeitpunkt eingeführt. Der Stil ist gesperrt. Punkte erreichen wollen

Wie verwende ich ThinkPHP6 für die JWT-Authentifizierung? Wie verwende ich ThinkPHP6 für die JWT-Authentifizierung? Jun 12, 2023 pm 12:18 PM

JWT (JSONWebToken) ist ein einfacher Authentifizierungs- und Autorisierungsmechanismus, der JSON-Objekte als Sicherheitstoken verwendet, um Benutzeridentitätsinformationen sicher zwischen mehreren Systemen zu übertragen. ThinkPHP6 ist ein effizientes und flexibles MVC-Framework, das auf der PHP-Sprache basiert. Es bietet viele nützliche Tools und Funktionen, einschließlich des JWT-Authentifizierungsmechanismus. In diesem Artikel stellen wir vor, wie Sie ThinkPHP6 für die JWT-Authentifizierung verwenden, um die Sicherheit und Zuverlässigkeit von Webanwendungen zu gewährleisten

So lösen Sie das Problem, dass Springboot nach dem Einlesen in ein JAR-Paket nicht auf die Datei zugreifen kann So lösen Sie das Problem, dass Springboot nach dem Einlesen in ein JAR-Paket nicht auf die Datei zugreifen kann Jun 03, 2023 pm 04:38 PM

Springboot liest die Datei, kann aber nach dem Packen in ein JAR-Paket nicht auf die neueste Entwicklung zugreifen. Es gibt eine Situation, in der Springboot die Datei nach dem Packen in ein JAR-Paket nicht lesen kann ist ungültig und kann nur über den Stream gelesen werden. Die Datei befindet sich unter resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Dec 29, 2023 am 11:02 AM

SpringBoot und SpringMVC sind beide häufig verwendete Frameworks in der Java-Entwicklung, es gibt jedoch einige offensichtliche Unterschiede zwischen ihnen. In diesem Artikel werden die Funktionen und Verwendungsmöglichkeiten dieser beiden Frameworks untersucht und ihre Unterschiede verglichen. Lassen Sie uns zunächst etwas über SpringBoot lernen. SpringBoot wurde vom Pivotal-Team entwickelt, um die Erstellung und Bereitstellung von Anwendungen auf Basis des Spring-Frameworks zu vereinfachen. Es bietet eine schnelle und einfache Möglichkeit, eigenständige, ausführbare Dateien zu erstellen

So verwenden Sie JWT und JWE für die API-Authentifizierung und -Verschlüsselung in PHP So verwenden Sie JWT und JWE für die API-Authentifizierung und -Verschlüsselung in PHP Jun 17, 2023 pm 02:42 PM

Mit der Entwicklung des Internets müssen immer mehr Websites und Anwendungen API-Schnittstellen für die Dateninteraktion bereitstellen. In diesem Fall werden API-Authentifizierung und -Verschlüsselung zu sehr wichtigen Themen. Als beliebte Authentifizierungs- und Verschlüsselungsmechanismen werden JWT und JWE zunehmend in PHP verwendet. In diesem Artikel wird erläutert, wie Sie JWT und JWE für die API-Authentifizierung und -Verschlüsselung in PHP verwenden. Grundkonzepte von JWT JWT steht für JSONWe

Wie SpringBoot Redis anpasst, um die Cache-Serialisierung zu implementieren Wie SpringBoot Redis anpasst, um die Cache-Serialisierung zu implementieren Jun 03, 2023 am 11:32 AM

1. Passen Sie den RedisTemplate1.1-Standard-Serialisierungsmechanismus an. Die API-basierte Redis-Cache-Implementierung verwendet die RedisTemplate-Vorlage für Daten-Caching-Vorgänge. Öffnen Sie hier die RedisTemplate-Klasse und zeigen Sie die Quellcodeinformationen der Klasse publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations an. Schlüssel deklarieren, verschiedene Serialisierungsmethoden des Werts, der Anfangswert ist leer @NullableprivateRedisSe

Analyse der sicheren JWT-Token-Generierungs- und Verifizierungstechnologie in PHP Analyse der sicheren JWT-Token-Generierungs- und Verifizierungstechnologie in PHP Jul 01, 2023 pm 06:06 PM

Analyse der sicheren JWT-Token-Generierungs- und Verifizierungstechnologie in PHP Mit der Entwicklung von Netzwerkanwendungen werden Benutzerauthentifizierung und -autorisierung immer wichtiger. JsonWebToken (JWT) ist ein offener Standard (RFC7519) zur sicheren Übertragung von Informationen in Webanwendungen. In der PHP-Entwicklung ist es gängige Praxis, JWT-Tokens zur Benutzerauthentifizierung und -autorisierung zu verwenden. In diesem Artikel wird die sichere JWT-Token-Generierungs- und Verifizierungstechnologie in PHP vorgestellt. 1. Grundkenntnisse von JWT im Verständnis der Generierung von und

See all articles