最近、権限と ds.authentify 関数によって REST API へのアクセスを制御する、強制ログインモードを新しく提供しました。このブログ記事で説明されているとおり、この機能は、これまで利用可能だった認証メカニズムよりもはるかに多くのことを提供します。
4D 20 R6 では、強制ログインが REST認証のデフォルトモードになりました。その理由と、移行を進める手順については、この記事を読み進めてください。
新規プロジェクトのデフォルト
4D 20 R6 でプロジェクトを新規作成すると、Sourcesフォルダーに roles.jsonファイルが自動的に作成されます。このファイルには、“true” に設定された forceLogin (強制ログイン) 属性と、デフォルトで REST API全体へのアクセスを拒否するための “none” 権限が設定されています。
このアプローチにより、設計上、高レベルのセキュリティが保証されます。
権限をカスタマイズするには、提供されている roles.json ファイルを編集するか、もっとユーザーフレンドリーなインターフェースとして Qodly Studio の Roles and Privileges エディターを使用します。
これで、データや関数への RESTアクセスを細かくコントロールできるようになりました!
既存プロジェクトの場合は?
既存のプロジェクトでは、ストラクチャー設定ダイアログの Web/Web機能タブに追加された新しいボタンで、プロジェクトを強制ログインモードに変換することができます。
このボタンをクリックすると、4D は:
- REST API への Read/Write アクセス権を持つユーザーグループを設定から削除します。
- データベースメソッド “On REST Authentication” をシステムのゴミ箱に移動します。
- “roles.json” ファイルがまだ存在しない場合には、これを Sourcesフォルダーに作成し、forceLogin属性を true に設定します。
この変換をおこなった後、プロジェクトを再起動することを忘れないでください。上のボタンが表示されない場合、プロジェクトはすでに強制ログインに対応しています。
従来の設定からの移行
強制ログインを導入するまで、REST のアクセス制御には 3つの選択肢がありました。以下では、強制ログインが有効な場合に、それらの方法をそれぞれ模倣するやり方を説明します。
例題では、Qodly Studio の Roles and Privileges エディターで作成した “Administrator” 権限を使用します:
1: アクセスグループなしで公開された Restサーバー
最初の選択肢は、アクセスグループを定義せず、”On REST Authentication” データベースメソッドでリクエストをフィルタリングせずに、RESTサーバーを公開する方法でした。
強制ログインでこの動作を再現する方法は、REST API 全体へのフルアクセスを許可するだけです:
Class extends DataStoreImplementation
exposed Function authentify() : Boolean
return Session.setPrivileges(“Administrator”)
この実装はセキュリティに欠けるため、推奨されないことに注意してください。すべてのデータと関数に、誰でもアクセスできてしまいます。
2: アクセスグループを定義して公開された RESTサーバー
2つ目の選択肢は、REST API への “読み込み/書き出し” アクセス権を持つ 4Dユーザーのグループを定義することでした。
この動作を再現するには、まず認証情報を確認し、ストラクチャー設定ダイアログで “読み込み/書き出し” アクセス権が許可されていたグループ (この例では “RestAccess” グループ) のメンバーであればフルアクセスを与えます:
Class extends DataStoreImplementation
exposed Function authentify($identifier : Text; $pwd : Text) : Boolean
If ($identifier#"")
If (Validate password($identifier; $pwd)
If (User in group($identifier; "RestAccess"))
return Session.setPrivileges(“Administrator”)
End if
End if
End if
この制限により、悪意のある接続に対してデータアクセスと関数が保護されます。認証された各接続は同じ権限を持ちます。
3: on rest authentication データベースメソッド
3つ目のオプションは、”On REST Authentication” データベースメソッドを使用してユーザー認証情報を確認することでした。この方法は、カスタムのユーザー管理システムでアクセスを制御するのによく使われていました。この動作を再現するには、下の例のように、”On REST Authentication” メソッドのコードを ds.authentify() 関数に ほぼコピーペーストできます。
“On REST Authentication” メソッド:
#DECLARE($identifier : Text; $pwd : Text) : Boolean
If ($identifier#"")
var $user : cs.UserEntity:=ds.User.query("identifier = :1"; $identifier).first()
If ($user#Null)
If (Verify password hash($pwd; $user.pwd))
return True
End if
End if
End if
上記を置き換える ds.authentify() 関数:
Class extends DataStoreImplementation
exposed Function authentify($identifier : Text; $pwd : Text) : Boolean
If ($identifier#"")
var $user : cs.UserEntity:=ds.User.query("identifier = :1"; $identifier).first()
If ($user#Null)
If (Verify password hash($pwd; $user.pwd))
return Session.setPrivileges(“Administrator”)
End if
End if
End if
一つ前の選択肢と同様に、認証された各接続は同じ権限を持ちます。データと関数へのアクセスは、自分でコーディングする必要があります。
次のレベルへ
強制ログインの強力な点は、任意のビジネスロジックや制限を REST接続にも適用できることです。これは特に、Qodly Pages やリモートデータストア接続、または、外部からの RESTリクエストに当てはまります。
以下の例では、ユーザーが認証されたときに “Administrator” 権限を定義する代わりに、ユーザーエンティティに格納されている権限をそのまま設定しています。これにより、データストア・データクラス・データクラス属性・関数のそれぞれに思うがままのきめ細かいアクセスを与え、それ以外を制限することができます!
Class extends DataStoreImplementation
exposed Function authentify($credentials : Object) : Boolean
If ($credentials#Null)
var $user : cs.UserEntity:=ds.User.query("identifier = :1"; $credentials.identifier).first()
If ($user#Null)
If (Verify password hash($credentials.pwd; $user.pwd))
return Session.setPrivileges($user.privileges)
End if
End if
End if
まとめ
強制ログインは、REST API からのデータや関数へのアクセスを正確に制御します。
コードから、定義されたパーミッションへとアクセスロジックを移すことができるので、アクセスに関するコードの見落としを防ぎ、より信頼性の高いセキュリティレベルを提供することができます。各データストア要素 (データストア自体、データクラス、データクラス属性、関数) についてパーミッションを定義し、許諾アクション (Create、Read、Update、Deleteなど) ごとに権限を付与できます。
権限を定義し、Qodly Studio の Roles and Privileges エディターを活用することで、より充実したユーザー体験が得られます。
この機能についてのフィードバックを4Dフォーラムで共有しましょう!