1

OpenID を Silex アプリケーションに統合しようとしていますが、それをSilex の認証サービス プロバイダーにフックする方法がわかりません。彼らは認証と承認をバンドルしているようですが、私はあまり熱心ではありません。

私がこれまでに持っているもの:

まず、 LightOpenIDを使用して OpenID ログイン URL を生成し、それを Twig テンプレートに挿入します。

$app['openid'] = $app->share(function (Application $app) {
    $openid = new \LightOpenID($app['request']->getHttpHost());
    $openid->identity = 'https://www.google.com/accounts/o8/id';
    $openid->returnUrl = $app->url('check_openid', array('returnUrl' => $app['request']->get('returnUrl', $app['request']->getRequestUri())));
    return $openid;
});

$app->before(function (Request $request) use ($app) {
    // todo: check if user is logged in, if not generate OpenID login url
    $app['twig']->addGlobal('openid', array('authUrl' => $app['openid']->authUrl()));
});

そして、それを私のTwigレイアウトの一部としてレンダリングします:

<a href="{{ openid.authUrl }}" class="btn btn-google-plus btn-xs" type="button"><i class="icon-google-plus"></i> Sign in with Google</a>

そのリンクをクリックすると、Googleが認証を行い、ここに返信します。

$app->get('/login/openid', function (Request $request) use ($app) {
    if(!$app['openid']->mode) {
        return $app->redirect($app['openid']->authUrl(), 303);
    } elseif($app['openid']->mode === 'cancel') {
        // TODO: redirect user back to login page w/ error message
        die('User has canceled authentication!');
    } elseif($app['openid']->validate()) {
        // TODO: log user in (set session variables)
        return $app->redirect($request->get('returnUrl', $app->path('home')), 303);
    } else {
        throw new Exception('User could not be validated');
    }
})->bind('check_openid');

私が立ち往生している場所:

Silex/Symfony のセキュリティ「ファイアウォール」を利用できるように、ユーザーをログインさせるにはどうすればよいですか? サイトのセクションを特定のユーザーのみに制限したいのです/adminが、ACL メカニズム全体を自分で実装したくありません。

4

1 に答える 1

1

LightOpenID を使用して独自の認証プロバイダーを実装するか、ID を検証した後にセッション変数を設定し、それを使用してユーザーを認証することができます。

2 番目の方法の例については、この実装https://github.com/KnpLabs/marketplace/blob/master/src/Marketplace/Provider/Service/Security.phpをご覧ください。

于 2013-10-16T13:19:44.520 に答える