この記事で扱っていること
- 規定回数間違えたらパスワード入力できなくなる仕組みを実装する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWプログラムで簡単なログイン画面を作成する方法は以前別記事で紹介していました。
今回の記事では、この応用として、規定回数以上ログイン操作を間違えたら、指定した時間以上たたないと再度ログイン操作ができないようにします。
ただし、操作ができない条件は、
- ユーザー名は合っている(データベースに同じユーザー名が登録されている)
- そのユーザー名に対するパスワードが登録と異なる
という場合にのみ適用します。
どんな結果になるか
ログイン画面は前回と変わりません。
ログイン時、有効なユーザー名を入れて、そのユーザー名に対して登録されている正しいパスワードを入力するとそのまま処理が終了する一方で、パスワードを間違えると「あと何回間違えられますよ」という表示を出します。
規定回数以上間違えると、それ以上パスワード入力が行えなくなります。そして設定した時間が経過すると再び入力ができるようになります。
プログラムの構造
デザインパターンは、イベント駆動型のステートマシンとしています。
イベントの数は3個、ステートの数は10個としています。
では実際にそれぞれのステートを見ていきます。
最初はinitializeステートで、ログイン時に照合するユーザ名やパスワードの情報が入ったファイル(下記の図ではlogininfo.csv)を読み込んで中身のデータ(2次元配列)を取り出します。
また制御器の値を空白にするためにローカル変数へ空文字を与えたりしています。
wait for eventステートです。ここから他のステートに進みます。
3個あるイベントについては以下の通りです。
次はusername checkステートです。最初の指標配列にて、ユーザ名の列の情報だけをまず取り出し、ユーザー名制御器と同じ値があるかを検索していきます。
検索の結果、一致するものがあればtime checkステートに進みますが、一致するものがないのであれば「ユーザー名が存在しません」の文字列とともにmessageステートに進みます。
なお、ユーザー名を間違えているだけではcsvファイルの中身を更新する必要はないため後述するupdateステートに進む必要がありません。
time checkステートでは、時間の情報を見ます。
この時間の情報というのは、もし以前にパスワードを規定回数以上間違えたことがあった場合にcsvファイルに記録されているもので、その時間情報と今の時間の情報を比較し、今の時間が十分経っているのであればpassword checkステートに進みますが、時間が経っていない状態なのであればパスワード入力を受け付けないのでmessageステートに進みます。
password checkステートでは、username checkステートでユーザ名を見つけた行の情報を使ってその行のパスワードの情報と「今までに何度パスワードを間違えたか」の情報を指標配列で抜き出して処理しています。
このステートの後には、後述するupdateステートに移り、間違えた回数等の記録をログファイルに保存していきます。
パスワードが合っているか、合っていない場合にはあと何回間違えられるかについて表示するようにしています。
パスワードが合っている場合、外側のケースストラクチャで部分配列置換を使用して3列目、つまり間違えた回数を記録する部分を0としています。
パスワードが間違っている場合、外側のケースストラクチャのFALSEステートにて、何回間違えられるか(以下の図では3回)、や、規定回数以上間違えたらどれくらい再入力を受け付けないか(以下の図では100秒)を決めることができます。
次のregisterステートでは、新規登録の際の処理を行っています。ユーザー名とパスワードおよび空白(指定した回数以上間違えた場合の時間情報を記録する用に空いている)と0(間違えた回数を記録する用の場所)を合わせてcsvファイルに保存しています。
あとは以前の記事で紹介したステートと同じです。
messageステートで、これまで他のステートにて決定されたメッセージの内容を処理します。ユーザー名とパスワードのペアが正しい場合に「認証しました」というメッセージとなりこの場合にはfinishステートに進みますが、それ以外はwait for eventステートに戻ります。
updateイベントではログファイルのアップデートを行います。新規登録とは別ステートとしています。
ログファイルを更新するべきタイミングは、新規登録時と、「ユーザー名は合っていてその後パスワードも合っているかを確認した後」、つまりpasswork checkステートの後のみです(ユーザー名を間違えた場合には特にペナルティはないため)。
cancelステートではプログラムを終了しますが、キャンセルフラグをTRUEにするようにしているため、このプログラムの後の処理で、ユーザー認証がキャンセルされたかどうかで内容を変える際に使用できます。
finishステートはプログラムを終了します。
パスワード照合不可状態を解除する方法
今回のプログラムの場合、指定した回数以上間違えた場合には一定時間入力できなくなります。
もしこれを解除したいという場合には、csvファイルの中身を編集する必要があります。
実際には、例えば管理者のみがこのcsvファイルを編集できるようにして(特定の権限を持つ人しか読み書きができないようなディレクトリにcsvファイルを置いておくとか)、時間情報(下記C列)や間違え回数(D列)の部分を0にすればまたパスワードを入力させることができるようになります。
この記事では、規定回数間違えたらパスワード入力ができなくなるユーザ認証画面の作成例を紹介しました。指定した回数以上間違えた場合にどの程度時間が経ったら再度入力可になるかに加えて、例えば日付が変わったら間違えた回数がリセットされるといった機能を付けても面白いかもしれません。
ここまで読んでいただきありがとうございました。
コメント