サポート » その他 » ログイン認証の際、ユーザ名を部分一致にしたい

  • WordPressの管理画面ログイン認証について
    ユーザ名、メールアドレスの入力の際、部分一致でログインできるようにしたいのですが、方法はございますか?

    やりたいこととしては、
    ユーザ名「@aaa.com」 パス「abcde」
    のアカウントで
    ユーザ名を「bbb@aaa.com」でも「ccc@aaa,com」でも、ユーザ名が含まれていればログインできるようにしたいという具合です。

    プラグインを使うことになるのでしょうか?
    恐れ入りますがご意見お願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター jim912

    (@jim912)

    できないことはありませんが、ちゃんと考えておく必要があります。

    まず、部分一致となるため、セキュリティ的にどうしても緩くなります。

    また、レアケースかもしれませんが、次のようなケースにおいて、どうするかなども考えておく必要があります。

    ケース1:入力文字列内に2ユーザーのアカウントが含まれている
    ユーザー aaaaa
    ユーザー bbbbb
    入力ユーザー名 aaaaabbbbb

    ケース2:あるユーザー名に他のユーザー名が包含されている
    ユーザー aaaaa
    ユーザー aaaaaa
    入力ユーザー名 aaaaaabbb

    プラグインの有無は存じ上げませんが、やり方としては、wp_authenticate アクションにフックして、入力された文字列から実在するユーザー名を割り出して、認証をかける方法になろうかと思います。

    この目的は、ユーザ登録の手間の削減でしょうか?
    だとしたら、bbb@aaa.comでログインしたユーザはbbb@aaa.comとして記事を作成したり更新したりする必要があるのではないでしょうか。
    そのような場合、全員分のユーザ登録は避けられないように思いますが・・・

    もしそうでないなら、aaa.comをユーザIDとして、これで全員がログインしてはダメなのでしょうか?

    jim912さんのご回答で解決されるかもしれませんが、後学のために目的をお教えいただけませんでしょうか。

    トピック投稿者 amaguri

    (@amaguri)

    jim912様

    ありがとうございます。
    仰るとおり、セキュリティは緩くなってしまいます。
    しかし、今回はそれでも実行したい理由がありました。

    また、wp_authenticateにフックすべく試行錯誤してみましたが、
    下記コードだったのですが、やはりダメですよね。記述方法全く違うような気がしてならないです。
    どの部分の修正が必要かご教授お願いできないでしょうか?

    function login_with_email_address($username) {
    $user = get_user_by(‘email’,$username);

    if (strstr($users, $user)) {
    $username = $users->user_login;
    return $username;
    }

    }
    add_action(‘wp_authenticate’,’login_with_email_address’);

    トピック投稿者 amaguri

    (@amaguri)

    munyagu様

    目的は他にも周知する人が多く、多岐に渡る会社の人に共有するため少し融通のきいた認証にしたいということもありました。

    モデレーター jim912

    (@jim912)

    1. get_usersで全ユーザーを取得
    2. foreach で取得した全ユーザーをループ処理
    3. ユーザーの user_login の値が、入力されたユーザー名($username)に含まれているかを検証。(場合によっては、出現位置や、合致する文字数なども勘案して採否を決定)
    4. 含まれていた場合は、該当ユーザーの user_login を $username に代入
    5. $username を return

    という流れとなります。

    amaguri様

    ご回答ありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「ログイン認証の際、ユーザ名を部分一致にしたい」には新たに返信することはできません。