はじめに
HTMLなどの静的ファイルを置いたディレクトリに対し登録済みユーザーのみアクセス可能なアクセス制限をかけようと、Node.js+Express.js+Passport.jsでWEBサイトを構築しました。
ローカル認証方式で特定のディレクトリだけでなく配下のすべてのディレクトリとファイルに対しアクセス制限を掛ける方法がネットでは見つけられずハマったので解決法を共有します。
ソース
Passport.jsの設定等は他のサイトをご参照下さい。
/app/restrict というディレクトリ以下すべてに対するGETメソッドについて認証を求める方法は以下の通りです。
app.get(/app\/restrict/ , (req, res, next) => {
if (!req.isAuthenticated()) {
req.session.originalUrlSave=req.originalUrl;
res.render('login', { error: req.flash('error'), title: 'ログインページ' });
}
else {
return next();
}
});
- ディレクトリの指定に正規表現を使います
- 認証済みなら return next(); でGETしに来たファイルがそのまま返ります
- restrictディレクトリ配下のURLに直接アクセスして来た場合に、ログイン画面でログイン成功したらそのURLに飛べるよう元のURLをセッションに保存しておきます。
終わりに
最初は
app.get('/app/restrict' , (req, res, next) => {
と書いていて、restrictディレクトリは意図通りアクセス制限が効くのですが、
/app/restrict/js
のようなサブディレクトリには全くアクセス制限が効いていないことに気づいて焦りました。
「指定したディレクトリの配下も掛かるハズ」と言った先入観を捨ててテストはしっかりやらないと怖いですね。