laravel5.5標準認証で、別グループ(別会社)毎に同じログインIDを使いたい & IP制限もしたい!
1, テーブル定義で、以下のようにログインIDと会社IDでユニークになるようにする。
1 2 3 4 5 6 7 8 9 10 11 |
public function up() { Schema::create('company_admins', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('username')->comment('email代わりのログインID'); $table->integer('company_id')->unsigned()->comment('どの企業の担当者か?'); // 別の会社なら、同じログインIDがあってもOK! $table->unique(['username', 'company_id']); |
2, 新規作成のvalidateも、ログインIDと会社IDでユニークになればOKにする。
※更新でログインIDは変更不可!
1 2 3 4 5 6 7 8 9 10 11 |
$this->validate($request, [ 'name' => ['required', 'string', 'max:255'], 'username' => ['required', 'string', 'max:255', 'alpha_dash', // 英数字と-(ダッシュ)と_(アンダーバー)はOK // 別の会社なら、同じログインIDがあってもOK!ログインIDの更新は無し 'unique:company_admins,username,NULL,company_id,company_id,'. Auth::user()->company_id ], 'password' => ['required', 'string', 'regex:/\A(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[a-zA-Z\d]{12,}+\z/'], 'email' => ['required', 'string', 'max:255'], ]); |
3, ログインの処理で、usernameとpassword以外に、IPからcompany_idも一致するかチェックする
LoginController.php -> AuthenticatesAndResistersUsers -> AuthenticatesUsers とドンドンuse traitを辿っていくと、credentialsアクションが見つかる。
phpフレームワークは、ライブラリのソース・リーディングが出来るので、頑張れば結構色々と追加できる(C言語の標準関数のソースを読んでみよう!って懐かしさがあるね)
1 2 3 4 5 6 7 8 9 10 11 |
class LoginController extends Controller { // ログイン情報(標準はIDとパスワードだけ)に項目を追加する protected function credentials(Request $request) { // アクセスIPにより、どの企業か特定する。その企業に属するアカウントのみ認証する // 未登録IPなら、認証には必ず失敗する(企業に属さないアカウントは存在しない) $company = Company::where('admin_ip_address', \Request::ip())->first(); return array_merge($request->only($this->username(), 'password'), ['company_id' => $company->id]); //return $request->only($this->username(), 'password'); } |