バリデーションでできるのかもしれませんが、単にAuth::logout()として、ログイン画面に飛ばせば良いですね。
$user = Auth::user(); if($user->name == "hpscript"){ Auth::logout(); return redirect('/login')->withErrors(array('name' => 'ログインできません。')); }
なかなか奥が深い。
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
バリデーションでできるのかもしれませんが、単にAuth::logout()として、ログイン画面に飛ばせば良いですね。
$user = Auth::user(); if($user->name == "hpscript"){ Auth::logout(); return redirect('/login')->withErrors(array('name' => 'ログインできません。')); }
なかなか奥が深い。
IDやパスワードにalpha_dashを使おうとすると、日本語が通過してしまう。独自ルールを作る。
$ php artisan make:rule AlphaRule
app/Rules/AlphaRule.php
public function passes($attribute, $value) { // return preg_match('/^[!-~]+$/', $value); } public function message() { return ':attribute は半角英数字記号で入力してください'; }
Request内で使用
use App\Rules\AlphaRule; // 省略 'name' => ['required','unique:users,name','min:2','max:24',new AlphaRule],
->
ID は半角英数字記号で入力してください
これは実装が相当簡単
Laravel8系の場合、LoginControllerが無くなり、fortifyになった。
それに伴い、以前まであった、一定時間内に規定の回数以上ログインに失敗した時にかかるロックが無効化されている。
### 仕組み
config/fortify.php
'limiters' => [ 'login' => null, ],
/vendor/laravel/fortify/routes/routes.php
$limiter = config('fortify.limiters.login');
#### Limit
app/Providers/RouteServiceProvider.php
L configureRateLimitingの中に書く。
RateLimiter::for('login', function (Request $request) { return new Limit('', 2, 5); });
config/fortify.php
'limiters' => [ 'login' => 'login', ],
Limitの使い方
class Limit (View source)
Properties
– mixed|string $key The rate limit signature key.
– int $maxAttempts The maximum number of attempts allowed within the given number of – minutes.
– int $decayMinutes The number of minutes until the rate limit is reset.
– callable $responseCallback The response generator callback.
Limit(”, 2, 5)だと、2回失敗したら、5分間は再ログインできなくなる。
どんくらいが妥当だろうか? 10回失敗したら10分とか?
パスワードの総当たり試行はブルートフォース攻撃というらしい。なるほどね。
private_keyを使ってControllerで処理をするとして、Controllerの中にprivate_keyを使うのは宜しくない。
ということで、.envに保存する。
.env
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nhogehogefugafuga\n"
controllerからenvファイルを呼び込むのは宜しくないらしいので、configを経由する。
config/app.php
'private_key' => env('PRIVATE_KEY'),
controller
$value = config('app.private_key'); dd($value);
ほう、なるほど。
とりあえずrepository作り直す。
csvでパスワードリストを読み取り、1行ずつハッシュ化したパスワードに変えて、新しいハッシュ化リストcsvを作る。
ハッシュ化はpassword_hash($value, PASSWORD_DEFAULT);で書く。
if (($handle = fopen("list.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle))) { foreach ($data as $value) { $hashedpassword = password_hash($value, PASSWORD_DEFAULT); $list[] = array($value, $hashedpassword); } } fclose($handle); } $fp = fopen('new_list.csv', 'w'); foreach ($list as $fields) { fputcsv($fp, $fields); } fclose($fp); echo "done";
password1,$2y$10$9Bonz2Ou5aJ1eOJl8Nf9eOipsRRWLpPbesCn.05J.W/pu0vItQ2mW
password2,$2y$10$d4OP/5HRbNWnS2BJS7w4puvWWXCj4Y2dxAmp0wS2E84Mpvc2udCqK
password3,$2y$10$u7IghXiVsUsVarK.n46X3eqP/uAzYMmtPCXLynXtYYy5nUlSCC0b6
password4,$2y$10$qgaJzGVySJT6ll7k3I0ZwewX/ia.a2KVK3XLjH/VJuSXJ4nzdi4Fy
password5,$2y$10$VcejFdWMC6M/hI4BRZfyyeglttkqzbO41TZUexek6b58rxejgYcKG
password6,$2y$10$.lhQys3h4ukEGxn8azvzDu76l0KHNvjZYxAHfPcLu3zvshbHV78oC
password7,$2y$10$KVWoquH7WRj1bDn2l88vo.N845A4vwvuguMxRPX1G/m6uF9q63A5C
password8,$2y$10$PFDr/P4fpC0kmxQofbfb0.jHGDvQqJoRe8RPCyQlYkDozCLWhjCLy
password9,$2y$10$ZAvichguRHYMkc42fPVXVex8x7xp9/by/BDmOVaW6vRpvMSr7dIm6
password10,$2y$10$L09R/P2BX2ougk3rxHVqWelI/rJrFlTlkVr4RE7U/chw7tWZob1gu
$list[] = array($value, $hashedpassword); のところで、$hashedpasswordだけの配列を作るときは、$list[] = $hashedpasswordではなく、$list[] = array($hashedpassword);とする。
Ok, Not bad, keep going
普通の連想配列です。
$sales = [ "a" => 200, "b" => 300, "c" => 400 ]; var_dump($sales);
array(3) { [“a”]=> int(200) [“b”]=> int(300) [“c”]=> int(400) }
$key と $valueがあり、連想配列の中に$keyがなければ追加していく。
arsortで降順でソートする。
$key = "d"; $value = 250; $sales = [ "a" => 200, "b" => 300, "c" => 400 ]; if($sales[$key] !== null){ $sales[$key] += $value; } else { $sales += array($key => $value); } arsort($sales); var_dump($sales);
array(4) { [“c”]=> int(400) [“b”]=> int(300) [“d”]=> int(250) [“a”]=> int(200) }
なんかOKっぽいな。多分。
ログイン時のエラーメッセージを変更したい。
Whoops! Something went wrong.
These credentials do not match our records.
/resources/lang/en/auth.php
'failed' => 'These credentials do not match our records.', 'password' => 'The provided password is incorrect.', 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
これを/resources/lang/ja/にコピーして中身を変える。
「Whoops! Something went wrong.」の箇所を変えたいな。。
use Illuminate\Support\Facades\Hash; $user = Auth::user(); $password = $request['password']; if (!Hash::check($password, $user->password)) { return redirect()->back()->withInput()->withErrors(array('password' => 'パスワードが一致しません。')); }
Hashを使うのか。なるほどね。
値を慌ててupdateしたい。
update users set name=’営業所’ and tel=’03-1234-5678′ where id=1;
-> ERROR 1292 (22007): Truncated incorrect DOUBLE value: ‘営業所’
なんやと!!!
update users set name=’営業所’, tel=’03-1234-5678′ where id=1;
andではなく、カンマ(,)で区切るのが正解なんだと。。
ビックリするぜ。
CSSファイルの分割方法
default.css リセットのCSS・基本スタイルとなるCSSを記述しています。
common.css レイアウト・ページ独自のCSSまで全て記載
index.css トップページのCSS
about.css aboutディレクトリのCSS
product.css productディレクトリのCSS
news.css newsディレクトリのCSS
なるほど、ページ名でcssファイルを作るのね。
てっきりstyle1.css, style2.cssで行こうかと思ってた。。。
これは滅茶苦茶恥ずかしい。。