7

SSO 実装である Shibboleth によって保護された Jersey API があります。Shibboleth は、ログインしているユーザーの ID をリクエスト属性に入れます。バックエンドでは、認証に Shiro を使用しています。Shiro は、アクセス許可をロードできるように、ログインしているユーザーを知りたいと考えています。

その userId を request 属性から Shiro に取得する正しい方法は何ですか? 今、私が試しているのは:

@Provider
public final class ShiroLoginFilter implements ContainerRequestFilter {

    @Context
    private HttpServletRequest request;

    @Override
    public void filter(final ContainerRequestContext requestContext)
        throws IOException {

        final String userId = (String) this.request.getAttribute("nameid");
        final Subject subject = SecurityUtils.getSubject();
        subject.login(new LocusAuthenticationToken(userId));

    }
}

残念ながら、JERSEY-1960により、リクエスト コンテキストをフィルターに挿入できません。権限をロードするには、すべてのユーザーが「ログイン」する必要があります。API のすべてのメソッドでログイン コードを繰り返す必要はありません。また、web.xml フィルターの使用も許可されていません (上司から)。ここで何か良い選択肢はありますか?

4

1 に答える 1

12

メソッドの JavaDoc で説明されているように、ContainerRequestContext#getPropertyを介してServletRequest属性を直接取得することもできます。ContainerRequestContext

サーブレット コンテナでは、プロパティは と同期され、ServletRequestで使用可能なすべての属性を公開しますServletRequest。プロパティの変更は、関連付けられた の一連のプロパティにも反映されますServletRequest

注:注入HttpServletRequestは、Jersey 2.4 (2013 年 10 月にリリース) 以降、期待どおりに機能するはずです。

于 2013-10-30T20:35:36.667 に答える