Java Spring Boot プロジェクトと Discuz! フォーラムの同期ログインとログアウト

から乗り換えました
Java Spring Boot プロジェクトとDiscuz!

私のメイン サイト Spring Boot は Discuz に接続しています! -api-for-java は、現在の Spring Boot スタイルに適応するために部分的に変更されました。

まず第一に、オープンソースに感謝します

Discuz! での公開は大きく API 通信とデータベース通信に分かれますが、今回は API による通信を紹介するので discuz-ucenter-api-for-java について触れておきます。 : Liang Ping (no_ten@163 .com) はコードをオープンソース化してくれたので、時間を大幅に節約できました。

再変更されたオープンソース コード

ソース コードをダウンロードした後、このコードはまだ 2009 年のもので、レトロなスタイルに満ちており、元の作成者が PHP コードに基づいて翻訳したものであることがわかりました。そのため、コードに含まれる習慣の多くは Java の習慣ではありません。サーブレットではなく、Maven ビルドをサポートします。これは現在の Spring Boot プロジェクトでは場違いなので、ソース コードを修正して再度リリースしました。
Maven によって構築された Spring Boot スタイルに適応させるために、プロジェクト アドレス: https://github.com/renfei/discuz-ucenter-api-for-java に次の変更を加えました。

  • プロジェクト パッケージを Maven 中央ウェアハウスに公開する
  • 現在の Java JDK8 をベースに、オリジナルの作成者の Base64 実装が削除され、JDK8 が提供する java.util.Base64 が使用されるため、実行するには少なくとも JDK8 が必要です。
  • メソッド名の下線スタイルをキャメルケースに変更します。たとえば、「uc_user_delete()」を「ucUserDelete()」に変更します。
  • PHP スタイルの変数名を一般的な Java 変数名に変更します。たとえば、「String $module」を「String $module」に変更します。
  • 設定ファイルを使用する方法をインスタンス化時に構築メソッドにパラメータを渡す方法に変更
  • 構成サーブレットを変更して独自のコントローラーを定義し、HttpServletRequest および HttpServletResponse を処理します。
  • 中国語の文字化けの問題がいくつか修正されました

Discuz の UCenter 構成

統合を開始する前に、インターフェイス アドレス、通信キー、APPID を取得するように Discuz の UCenter を設定する必要があります。まず、Discuz のバックグラウンド UCenter に移動し、アプリケーションを追加します。
ここに画像の説明を挿入
次に、構成を入力し、アプリケーション タイプとして「その他」を選択し、アプリケーションに名前を付け、アプリケーションのメイン URL アドレスとして自分のアドレスを入力します。通信キーのパスワードを自分で設定し、一番下で同期ログインを有効にして通知を受け入れることを選択します。
ここに画像の説明を挿入

Spring Boot 集成 discuz-ucenter-api-for-java

Maven によって構築された Spring Boot プロジェクトを使用しているため、最初に pom.xml を変更して、discuz-ucenter-api-for-java をプロジェクトに導入する必要があります。

<dependency>
  <groupId>net.renfei</groupId>
  <artifactId>discuz-ucenter-api-for-java</artifactId>
  <version>1.0.7</version>
</dependency>

次に、個人的には 2 つの部分に分かれていると考えています。1 つはクライアントとして Discuz の UCenter からメッセージを受信することであり、もう 1 つは Discuz の UCenter に積極的にメッセージを送信することです。これについては別々に説明します。

Discuz の UCenter からメッセージを受信する

まずコントローラーを作成し、次に HttpServletRequest と HttpServletResponse を処理するメソッドを作成し、UCenter リクエスト アドレス @RequestMapping("/api/uc.php") を指定して、クライアント net.renfei.discuz.ucenter.api.UCClient と net をインスタンス化します。 .renfei.discuz.ucenter.client.Client を呼び出し、HttpServletRequest を net.renfei.discuz.ucenter.api.UCClient.doAnswer() に渡して処理し、最後に結果を HttpServletResponse に書き込みます。UCenter の設定が正しい場合は、 UCenter で通信が正常に行われていることがわかります。具体的な使用例は次のとおりです。

@Controller
public class UCenterController {
    
    
    @ResponseBody
    @RequestMapping("/api/uc.php")
    public void uc(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    
        UCClient ucClient = new UCClient();
        Client client = new Client("http://localhost:8080/uc_server", null, "123456789", "3","");
        String result = ucClient.doAnswer(client, request, response);
        response.getWriter().print(result);
    }
}

Discuz の UCenter に積極的にメッセージを送信する

登録する

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
String string = client.ucUserRegister("username","password","email");

最初にログインしてから同期的にログインします

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
// 登陆
String result = client.ucUserLogin(uid);
LinkedList<String> rs = XMLHelper.ucUnserialize(result);
if(rs.size() > 0){
    
    
    int uid = Integer.parseInt(rs.get(0));
    String username = rs.get(1);
    String password = rs.get(2);
    String email = rs.get(3);
    if(uid > 0) {
    
    
        //同步登陆
        String string = client.ucUserSynlogin(uid);
        //本地登陆代码
        //TODO ... ....
    } else if(uid == -1) {
    
    
        System.out.println("用户不存在,或者被删除");
    } else if(uid == -2) {
    
    
        System.out.println("密码错");
    } else {
    
    
        System.out.println("未定义");
    }
}else{
    
    
    System.out.println("Login failed");
    System.out.println(result);
}

ログイン

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
String string = client.ucUserLogin("username","password");

同時ログイン

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
int UID = 21; //此处是用户的UID(该UID是在论坛用户表per_ucenter_members中的用户UID)
String string = client.ucUserSynlogin(uid);

よくある問題

同期ログインインターフェイスは成功しましたが、ログインステータスがありません

  • 症状: net.renfei.discuz.ucenter.client.Client#ucUserSynlogin を正常に呼び出し、JavaScript コードを取得し、JS アドレスを正常に要求しましたが、Discuz へのアクセス時にログイン ステータスが表示されません。リクエストされた JS アドレスの Response ヘッダー情報を確認してください。Set-Cookie に xxxx_2132_auth Cookie がありません。
  • 検出シーン: 最初に net.renfei.discuz.ucenter.client.Client#ucUserRegister を呼び出してユーザーを登録し、次に net.renfei.discuz.ucenter.client.Client#ucUserLogin を呼び出して uid を取得し、次に net.renfei.discuz を呼び出します。 ucenter.client.Client#ucUserSynlogin は同期ログインを実行して JavaScript コードを取得し、ブラウザは JS アドレスを要求します。これらはすべて成功した状態ですが、Discuz へのアクセスはログイン状態ではありません。
  • 問題の根本原因: ユーザー登録のために net.renfei.discuz.ucenter.client.Client#ucUserRegister を呼び出した後、ユーザー情報は UCenter に登録され、pre_ucenter_members テーブルに挿入されますが、pre_common_member テーブルには自動的に挿入されません。 Discuz フォーラムの net .renfei.discuz.ucenter.client.Client#ucUserSynlogin を呼び出します。同期ログインは成功しました。Discuz にアクセスすると、このユーザーに関する情報が Discuz にないため、ログイン ステータスは表示されません。
  • 解決策: 最初の方法: 登録ユーザーのロジックがデータベースに直接接続され、ユーザー関連データが UCenter と Discuz のユーザー関連テーブルに挿入されます。2 番目の方法: UCenter のコードを変更し、UCenter ユーザー テーブルにユーザー情報を挿入するときに、Discuz ユーザー テーブルにもユーザー情報を挿入します。
  • 最終的なまとめ: UCenter はさまざまなアプリケーションのユーザー アカウントを接続する単なる中間ブリッジですが、各アプリケーションに新しいユーザーが存在することは通知しません。Discuz に付属のログイン ページでログイン時にそのようなユーザーが存在しないことが判明した場合、 UCenter からユーザー情報を取得します。独自のユーザー テーブルを挿入します。そのため、UCenter 登録インターフェイスを通じてユーザーを登録した後、このユーザーが Discuz にログインしたことがない場合、このユーザーに関する情報は Discuz にありません。統一された方法でログインして確認したい場合は、Discuz のユーザー テーブルに関連情報を挿入する必要があります。これには複数のテーブルが含まれます。公式ドキュメントを参照してください。

詳細については、ソース コードを参照してください。ここでは説明しません。問題を提起するか、私のコミュニティ フォーラムにアクセスして議論することができます: https://bbs.renfei.net/forum-44-1.html

おすすめ

転載: blog.csdn.net/qq_27480007/article/details/128716711