Vueにログイン認証傍受機能を設置するアイデアを詳しく解説

Vueにログイン認証傍受機能を設置するアイデアを詳しく解説

こんにちは、バグを書くのが本当に得意なプログラマーの灰小猿です。

今日、vue と springboot が連携するプロジェクトに取り組んでいたとき、ログイン認証後に特定のページへのアクセスのみを許可するフロントエンドベースの操作を実装したかったので、この機能を実現するためのソリューションを紹介します。

まず、ログインしたかどうかを確認する方法を説明します。

1. 解決策

私の Springboot バックグラウンドでは shiro+Jwt セキュリティ フレームワークが使用されているため、ログイン後にtokenがフロントエンドにフィードバックされ、フロントエンドがそのトークンを保存するので、ブラウザにトークンがあるかどうかを確認します。ブラウザにトークンがある場合は、ログインが成功し、関連するページにアクセスできることを意味します。

トークンがない場合はログインしていないことを意味し、ログインページにジャンプします。操作を簡素化するために、検証プロセスをカプセル化しました。

注意:この方法を検証に使用する前提は、フロントエンドとバックエンドが Shiro とトークンを通じて検証され、フロントエンドがサーバーから返されたトークンを保存することです。

2. サーバーから返されたトークンをブラウザに保存する

まず、サーバーから返されたトークンがフロントエンドページにどのように保存されるかを見てみましょう。

まず、ストア ファイルの下にある index.js ファイルに SET_TOKEN メソッドをカプセル化して、トークンをブラウザーに保存し、localStorage.getItem("token") を介して毎回ローカルからトークンを取得できるようにしました。また、ログアウト時にブラウザーのトークン情報をクリアする REMOVE_INFO メソッドもカプセル化しました。

ストア ファイルの index.js のコードは次のとおりです。

'vue' から Vue をインポートします
'vuex' から Vuex をインポートします

Vue.use(Vuex)

デフォルトの新しいVuex.Storeをエクスポートします({
    州: {
        // トークン: "",
        //ユーザー情報はブラウザトークンから直接取得できます: localStorage.getItem("token"),
        //デシリアライズ操作 userInfo: JSON.parse(sessionStorage.getItem("userInfo"))
    },
    突然変異:
        /**セット操作に似ています*/
        //トークンに値を割り当てる SET_TOKEN: (state, token) => {
            state.token = トークン;
            // ブラウザを閉じても情報が残るようにブラウザに情報を保存します。localStorage.setItem("token", token);
        },
        //userinfoに値を割り当てる SET_USERINFO: (state, userInfo) => {
            状態.userInfo = ユーザー情報;
            // ブラウザを閉じるたびにセッションはクリアされ、再度ログインすると再生成されます。 // sessionStorage はオブジェクトを保存できないため、文字列の形式で保存する必要があります。 sessionStorage.setItem("userInfo", JSON.stringify(userInfo));
        },
        //ユーザー情報を削除する REMOVE_INFO: (state) => {
            //ユーザー情報を削除する場合は、すべてのユーザー情報を空に設定します。state.token = "";
            状態.userInfo = {};
            localStorage.setItem("トークン", "");
            sessionStorage.setItem("userInfo", JSON.stringify(""));
        }

    },
    ゲッター: {
        /**get リクエストと同様*/
        //ユーザー情報を取得するgetUser: state => {
            state.userInfo を返します。
        }
    },
    アクション: {},
    モジュール: {}
})

3. リクエストにアクセス権限を設定する

すべてのページがログインしないとアクセスできないわけではないので、ログインが必要なページにはアクセス権限を設定する必要があります。

vue では、通常、ルーターの下の index.js ファイルにアクセス ルートを設定します。ログイン権限を追加する必要のあるリクエスト ルートには、メタ属性を追加し、ブール属性 requireAuth を設定できます。この属性が true かどうかによって、ログイン検証が必要かどうかを判断します。

たとえば、BlogEdit ページはログインしているときのみアクセスでき、Login ページにはログイン権限は必要ないので、次のように設定できます。 (代碼有刪減,但是保留了核心部分,只是刪除了部分路由。)

/**
 * ルーティングレジストリ */

'vue' から Vue をインポートします
'vue-router' から VueRouter をインポートします。


// 登録ページ import Login from '../views/Login.vue'
'../views/BlogEdit.vue' から BlogEdit をインポートします。


Vue.use(VueRouter)

定数ルート = [
    {
        パス: '/login',
        名前: 'ログイン',
        コンポーネント: ログイン
    },
    {
        パス: '/blog/add',
        名前: 'BlogAdd',
        コンポーネント: BlogEdit、
        // この操作はログイン後にのみ実行できることを示す権限アクセスを追加します。meta: {
            認証が必要: 有効
        }
    },


]

const ルーター = 新しい VueRouter({
    モード: '履歴'、
    ベース: process.env.BASE_URL、
    ルート
})

デフォルトルーターをエクスポートする

これは、BlogEdit ページが要求されるたびに判断されます。

4. カプセル化ログイン認証

ここで、設定したプロパティを検証するメソッドを記述する必要があります。したがって、src ディレクトリに permission.js ファイルを作成し、それをカプセル化します。

思路是這樣的:まず、リクエストをインターセプトし、リクエスト内の requireAuth パラメータを取得します。パラメータが true の場合、ブラウザでトークンを取得し、現在の状態がログイン済みであるかどうかを確認します。トークンが存在する場合、リクエストは許可されます。トークンが取得されない場合、リクエストはログイン ページにリダイレクトされます。

注意:他の認証に基づいてログインする場合は、
//ローカルトークンを取得する
const トークン = ocalStorage.getItem("トークン")
検証方法は変わりますが、考え方は同じです。

コードは次のとおりです。

/**
 * ログイン認証を要求します。ログインしていない場合はページにアクセスできず、ログインページに戻ります*/
「./router」からルーターをインポートします。

// ルーティング設定ファイルのパラメータに従って、ルート判定ログイン router.beforeEach((to,from,next)=>{
    //ルートにログイン権限が必要かどうかを判断する//record.meta.requireAuthはリクエストに含まれるパラメータです if (to.matched.some(record => record.meta.requireAuth)){
        //ローカルトークンを取得する
        const トークン = localStorage.getItem("トークン")
        console.log("トークンを表示----------: " + トークン)

        //現在のトークン、つまりログインに使用されたトークンが存在するかどうかを判断します
        if (トークン){
            //ログインページを指している場合は何もしない if (to.path === "/login"){

            }それ以外 {
                //ログインページではなくトークンが存在する場合はnext()を解放します
            }
        }それ以外 {
        // トークンが存在しない場合は // ログインへ進む next({path:'/login'})
        }

    }それ以外 {
        //ログイン認証が不要な場合は、next()に直接アクセスします
    }
})

最后別忘了將該頁面引入到mian.js中。

//permission.js をインポートし、ユーザーがフロントエンドの権限制御を実行しますimport "./permission"

総括する

主な操作は 3 番目と 4 番目のステップです。リクエスト ルートにログイン検証パラメータを設定し、4 番目のステップにログイン傍受検証を記述して、main.js ファイルに導入すれば完了です。

この時点で、フロントエンド検証を通じてログインの傍受が完了します。

これで、Vue にログイン認証インターセプト機能を設定するアイデアの詳細な説明に関するこの記事は終了です。より関連性の高い vue ログイン認証インターセプトコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue+springbootでログイン認証コードを実現
  • Vue はグラフィック検証コードログインを実装します
  • Vueはログイン時に画像認証コードを実装します
  • Vueでのログイン検証が成功するとトークンが保存され、各リクエストはトークン操作を伝達して検証する。
  • Vueログインはログイン後に指定ページにジャンプし続ける操作をインターセプトします
  • vue+axios フロントエンドでログインインターセプションを実装する 2 つの方法 (ルーティングインターセプション、http インターセプション)
  • Vue axios ログインリクエストインターセプター
  • vue+axios でログインインターセプションを実装するためのサンプルコード

<<:  Docker デプロイメント nginx 実装プロセスのグラフィックとテキストによる詳細な説明

>>:  HTML_PowerNode 入門 Java アカデミー

推薦する

Linux での MySQL の文字化け問題の解決方法

プロジェクトはサーバーと対話し、post を通じてサーバー側の jsp にアクセスし、jsp はサー...

ElementUIはel-formフォームリセット機能ボタンを実装します

目次ビジネスシナリオ:効果のデモンストレーション:ビジネスシナリオ: el-form を使用する場合...

Vueはプルダウンとスクロールでデータを読み込む例を実装しています

目次ステップ1: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...

大きな太陽の天気アイコンを純粋な CSS で記述する方法の例

効果効果図は以下のとおりです実装のアイデアDivは太陽の長方形の光と影を実現します前の疑似要素は、既...

Docker ベースの Jenkins のデプロイに関する詳細なチュートリアル

このドキュメントを作成した当時は2019年12月頃で、er2.200が最新バージョンでした。 1.画...

Vue nextTickの原理の分析

目次イベントループmiscroTask (マイクロタスク) UI レンダリング (重要なポイント)次...

テーブル設定の背景画像が100%表示されない解決策

開発中に以下の状況が発見されました。 (1) ファイルが.jspファイル拡張子で保存されている場合、...

CentOS 7 での mysql 5.7 のインストール チュートリアル

1. 公式MySQL Yumリポジトリをダウンロードしてインストールする 実行ファイル: mysql...

Linux システム (CentOS7 インストール) に JDK8 をインストールするための詳細なチュートリアル

JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...

IIS7~IIS8.5 サーバープロトコルヘッダーの削除または変更

要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...

MySQL B-Tree インデックスの簡単な分析

Bツリーインデックス異なるストレージ エンジンでは、異なるストレージ構造を使用する場合もあります。た...

NODE.JS を使用して WEBSERVER を作成する手順

目次Node.jsとはNodeJSをインストールするNode を使用して Hello World を...

MySQL 8 の新機能: 非表示のインデックス

背景インデックスは諸刃の剣です。クエリ速度は向上しますが、DML 操作も遅くなります。結局のところ、...

Vue+Bootstrapでシンプルな学生管理システムを実現

参考までに、vueとbootstrapを使って比較的シンプルな生徒管理システムを作りました。具体的な...

JavaScript ファイルの読み込みとブロックの問題: パフォーマンス最適化のケーススタディ

まず質問させてください。HTML ページを作成するときに、外部から JS ファイルをインポートする場...