Unixの世界には、人間が使用する「ユーザーアカウント」と、ソフトウェアが使用する「システムアカウント」があります。
Drupalサイトには、services.module
API呼び出しで使用することを目的としたシステムアカウントがいくつかあります。
これらのアカウントがサービスAPIを介して(明らかに)ログインできるようにしたいのですが、これらのアカウントが標準のuser_login
フォームを介してログインするために使用されるのをブロックしたいと思います。また、これらのアカウントが「Who'sonline」ブロックなどの標準の「アクティブユーザー」リストに表示されないようにしたいと思います。
これにどのようにアプローチすればよいですか?
APIキー認証の使用について検討しましたか?これにより、ユーザー名とパスワードの組み合わせを使用せずに効果的にログインできるようになります。
詳細については、 http://drupal.org/node/762092 を参照してください。
プロジェクト問題追跡 モジュールの機能を参照して返信します。
プロジェクトの問題追跡モジュールは、2週間修正済みとしてマークされた問題レポートのステータスを「クローズ(修正済み)」に変更します。その間、「システムメッセージ」ユーザーによって投稿された結果のコメントが追加されます(モジュールには、そのユーザーを他の既存のユーザーに変更できる設定があります) このコメント に表示されます。 =。
このようなコメントを作成するために、モジュールは関数user_load()
(関数 _ project_issue_followup_get_user() を参照)を使用し、グローバル変数$user
の内容を変更し、そのタスクを実行し、次に、グローバル変数の値を元に戻します。完全な操作は、CRONタスク中に開始されます(project_issue_auto_close()
を呼び出す _ project_issue_cron() 関数を参照してください project_issue_add_auto_followup() を呼び出すproject_issue_add_followup()
)。
これらの操作のいずれにおいても、「システムメッセージ」ユーザーは、最近ログインしたユーザーのリスト、またはオンラインユーザーのリストに表示されます。
「Who'sonline」ブロックに表示されないのは、そのブロックを出力するフック(user_block())がSQLクエリとしてSELECT uid, name FROM {users} WHERE status != 0 AND access != 0 ORDER BY created DESC
を使用してオンラインユーザーのリストを取得するためです。 「システムメッセージ」ユーザーが実際のユーザーからログインに使用されることはないため、access
フィールドには常に0
が含まれます。そのデータベースフィールドを別のフィールドに変更するモジュールがある場合は、そのようなシステムユーザーがオンラインユーザーとしてリストされないように、0に設定するだけで十分です。
モジュールで使用するために作成したユーザーアカウントのパスワードが見つけにくい場合、パスワードが自分だけに知られていれば、誰かがそれらのユーザーアカウントを使用してログインできるという事実は問題になりません。他の誰かがパスワードを知っていて(または誰かがユーザーアカウントに関連付けられたパスワードを変更できる)、システムアカウントの1つを使用してログインすることを避けたい場合(ユーザーアカウントに割り当てられていないアクセス許可がある可能性があることを考慮して) Drupal.orgで発生する他のユーザー(特定の目的で「システムユーザー」を使用する)の場合、hook_form_user_login()
を実装して、 ser_login())によって作成されたフォームにフォーム検証ハンドラーを追加できます。 、フォームを介して渡されたユーザー名が、ログインに使用したくないユーザーアカウントの1つに関連付けられているかどうかを確認するコードを追加します。
user_load()
にパスワードを渡す必要がないことに注意してください。パスワードは、ユーザーがログインしているときにのみ関数に渡され、Drupalは、ユーザーが正しいパスワードを入力したことを確認する必要があります。パスワードフィールドの内容を変更するためのthsuttonの提案「システムユーザー」を使用してログインしたことがない場合は、MD5チェックサムではないもの(つまり、32文字を含まない文字列、またはMD5チェックサムに存在しない文字を含む文字列)が有効です。
ユーザーを使用してログインすると、そのユーザーは最近ログインしたユーザーのリストに表示されます。これを回避したい場合は、アクセスフィールドを0にリセットする必要があります。