2

JAX-RS 2.0 と JPA を使用して Javae EE アプリを作成しました。現在のユーザー (ログイン中) をアプリケーション ユーザー データベースからのエンティティとして提供するために、(修飾子を使用して) User エンティティの特別なプロバイダーを作成しました。現在のユーザーを取得するには、使用します

@Context
private SecurityContext secContext;

問題は、これが null であることです。セキュリティは適切に設定されています (Wildfly 8.2) - アプリは認証 (基本) を要求しますが、SecurityContextnull です。コードは次のとおりです。

@RequestScoped
public class CurrentUserProducer implements Serializable {

    /**
     * Default
     */
    private static final long serialVersionUID = 1L;

    @Context
    private SecurityContext secContext;

    /**
     * Tries to find logged in user in user db (by name) and returns it. If not
     * found a new user with role {@link UserRole#USER} is created.
     * 
     * @return found user a new user with role user
     */
    @Produces
    @CurrentUser
    public User getCurrentUser() {
        if (secContext == null) {
            throw new IllegalStateException("Can't inject security context - security context is null.");
        //... code to retrieve or create new user
        return user;
    }

}

ご覧のとおり、null をチェックsecContextすると、注入するリソースに到達しようとするとすぐに例外が表示されます@CurrentUser

では、これを修正する方法は?なぜSecurityContextヌルです。

4

2 に答える 2

2

私のコメントで述べたように

SecurityContextは JAX-RS コンポーネントであり、他の JAX-RS コンポーネントにのみ注入できます。あなたが持っているのはCDI Beanだけです。それを EJB にして注入することができますSessionContextプログラムによる Enterprise Beanの保護を参照してください。

テストしていませんが、OP で動作するようです。これは EE スタック ソリューションです。

インジェクションを可能にするもう 1 つの JAX-RS (Resteasy 固有) の方法は、 (この回答ResteasyProviderFactoryの助けを借りて見つかりました) の助けを借りることです。にアクセスできる でこれを使用できます。RESTeasy ユーティリティ クラスを使用して、 をコンテキストにプッシュできます。これにより、注釈を挿入できます。ただし、カスタム注釈でどのように機能するかはわかりません。これが例ですContainerRequestFilterSecurityContextUser@Context

@Provider
public class UserContextFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext context) throws IOException {
        SecurityContext securityContext = context.getSecurityContext();
        String username = securityContext.getUserPrincipal().getName();

        ResteasyProviderFactory.pushContext(User.class, new User(username));
    }  
}

注: これは JAX-RS 2.0 ソリューション (RESTeasy 3.xx) です。2.0 より前のバージョンでは、ContainerRequestFilter

于 2015-06-03T08:38:29.110 に答える