セキュリティ & アクセス制御

認証アクター、認可スコープ、アクセスポリシーを管理します。

ロード

local security = require("security")

actor

実行コンテキストから現在のセキュリティアクターを返します。

local actor = security.actor()
if actor then
    local id = actor:id()
    local meta = actor:meta()

    logger:info("Request from", {
        user_id = id,
        role = meta.role
    })
end

戻り値: Actor|nil

scope

実行コンテキストから現在のセキュリティスコープを返します。

local scope = security.scope()
if scope then
    local policies = scope:policies()
    for _, policy in ipairs(policies) do
        print("Active policy:", policy:id())
    end
end

戻り値: Scope|nil

can

現在のコンテキストがリソースに対するアクションを許可するかチェックします。

-- 読み取り権限をチェック
if not security.can("read", "user:" .. user_id) then
    return nil, errors.new("PERMISSION_DENIED", "Cannot read user data")
end

-- 書き込み権限をチェック
if not security.can("write", "order:" .. order_id) then
    return nil, errors.new("PERMISSION_DENIED", "Cannot modify order")
end

-- メタデータ付きでチェック
local allowed = security.can("delete", "document:" .. doc_id, {
    owner_id = doc.owner_id,
    department = doc.department
})
パラメータ 説明
action string チェックするアクション
resource string リソース識別子
meta table 追加メタデータ(オプション)

戻り値: boolean

new_actor

IDとメタデータで新しいアクターを作成します。

-- ユーザーアクターを作成
local actor = security.new_actor("user:" .. user.id, {
    role = user.role,
    department = user.department,
    email = user.email
})

-- サービスアクターを作成
local service_actor = security.new_actor("service:payment-processor", {
    type = "service",
    version = "1.0.0"
})
パラメータ 説明
id string 一意のアクター識別子
meta table メタデータのキーバリューペア

戻り値: Actor

new_scope

新しいカスタムスコープを作成します。

-- 空のスコープ
local scope = security.new_scope()

-- ポリシー付きスコープ
local read_policy = security.policy("app:read-only")
local scope = security.new_scope({read_policy})

-- スコープを段階的に構築
local scope = security.new_scope()
local policy1 = security.policy("app:read")
local policy2 = security.policy("app:write")
scope = scope:with(policy1):with(policy2)

戻り値: Scope

policy

レジストリからポリシーを取得します。

local policy, err = security.policy("app:admin-access")
if err then
    return nil, err
end

-- ポリシーを評価
local result = policy:evaluate(actor, "delete", "user:123")
if result == "allow" then
    -- 許可
elseif result == "deny" then
    -- 禁止
else
    -- 未定義、他のポリシーをチェック
end
パラメータ 説明
id string ポリシーID "namespace:name"

戻り値: Policy, error

named_scope

事前定義されたポリシーグループを取得します。

-- 管理者スコープを取得
local admin_scope, err = security.named_scope("app:admin")
if err then
    return nil, err
end

-- 昇格操作に使用
local result = admin_scope:evaluate(actor, "delete", "user:123")
パラメータ 説明
id string ポリシーグループID

戻り値: Scope, error

token_store

認証トークンを管理するためのトークンストアを取得します。

local store, err = security.token_store("app:tokens")
if err then
    return nil, err
end

-- ストアを使用...
store:close()
パラメータ 説明
id string トークンストアID "namespace:name"

戻り値: TokenStore, error

Actorメソッド

メソッド 戻り値 説明
actor:id() string アクター識別子
actor:meta() table アクターメタデータ

Scopeメソッド

with / without

スコープにポリシーを追加または削除します。

local scope = security.new_scope()

-- ポリシーを追加
local write_policy = security.policy("app:write")
scope = scope:with(write_policy)

-- ポリシーを削除
scope = scope:without("app:read-only")

evaluate

スコープ内のすべてのポリシーを評価します。

local result = scope:evaluate(actor, "read", "document:123")
-- "allow"、"deny"、または"undefined"

if result ~= "allow" then
    return nil, errors.new("PERMISSION_DENIED", "Access denied")
end

contains

スコープにポリシーが含まれているかチェックします。

if scope:contains("app:admin") then
    show_admin_features()
end

policies

スコープ内のすべてのポリシーを返します。

local policies = scope:policies()
for _, policy in ipairs(policies) do
    print(policy:id())
end

戻り値: Policy[]

Policyメソッド

メソッド 戻り値 説明
policy:id() string ポリシー識別子
policy:evaluate(actor, action, resource, meta?) string "allow""deny"、または"undefined"

TokenStoreメソッド

create

認証トークンを作成します。

local actor = security.new_actor("user:123", {role = "user"})
local scope = security.named_scope("app:default")

local token, err = store:create(actor, scope, {
    expiration = "24h",  -- またはミリ秒
    meta = {
        login_ip = request_ip,
        user_agent = user_agent
    }
})
パラメータ 説明
actor Actor トークン用のアクター
scope Scope 権限スコープ
options.expiration string/number 期間文字列またはms
options.meta table トークンメタデータ

戻り値: string, error

validate

トークンを検証してアクター/スコープを取得します。

local actor, scope, err = store:validate(token)
if err then
    return nil, errors.new("UNAUTHENTICATED", "Invalid token")
end

戻り値: Actor, Scope, error

revoke

トークンを無効化します。

local ok, err = store:revoke(token)

戻り値: boolean, error

close

トークンストアリソースを解放します。

store:close()

戻り値: boolean

権限

セキュリティ操作はセキュリティポリシー評価の対象です。

セキュリティアクション

アクション リソース 説明
security.policy.get ポリシーID ポリシー定義へのアクセス
security.policy_group.get グループID 名前付きスコープへのアクセス
security.scope.create custom カスタムスコープの作成
security.actor.create アクターID アクターの作成
security.token_store.get ストアID トークンストアへのアクセス
security.token.validate ストアID トークンの検証
security.token.create ストアID トークンの作成
security.token.revoke ストアID トークンの取り消し

ポリシー設定についてはセキュリティモデルを参照。

エラー

条件 種別 再試行可能
コンテキストなし errors.INTERNAL no
空のトークンストアID errors.INVALID no
権限拒否 errors.INVALID no
ポリシーが見つからない errors.INTERNAL no
トークンストアが見つからない errors.INTERNAL no
トークンストアがクローズ済み errors.INTERNAL no
無効な有効期限フォーマット errors.INVALID no
トークン検証失敗 errors.INTERNAL no
local store, err = security.token_store("app:tokens")
if err then
    if errors.is(err, errors.INVALID) then
        print("Invalid request:", err:message())
    end
    return nil, err
end

エラーの処理についてはエラー処理を参照。

関連項目