4

Jersey 1.x では、 https://stackoverflow.com/a/15767824/1399659で説明されているように、(Jersey) セッション属性から Wicket セッションにアクセスしました。

Jersey 2.x への移行では、Spring Bean インジェクションも可能にするContainerRequestFilterを使用するのが適切なパターンのようです。含めることで、これが正常に機能しています

<param-name>jersey.config.server.provider.packages</param-name>

ServletContainer への init-param として、ContainerRequestFilter 実装で @Provider アノテーションを使用します。ただし、このコンテナ フィルタはシングルトンであり、これに HttpServletRequest を挿入することはできません ( JERSEY-2114を参照) 。

filter() メソッドではContainerRequestContextにアクセスできますが、そこから HttpServletRequest にアクセスすることはできません。

したがって、次のいずれかの方法があります。

  1. サーブレット フィルター内で Spring Bean インジェクションを有効にしますか (Jersey も使用)?
  2. ContainerRequestFilter 内からサーブレット リクエストにアクセスしますか?
  3. 他の方法でジャージーフィルタリング機能を使用して、Spring Bean 対応オブジェクトからウィケットセッションにアクセスしますか?

`

import java.io.IOException;

import javax.servlet.http.HttpSession;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;

import org.apache.wicket.injection.Injector;

@Provider
public class SecurityContextFilter implements ContainerRequestFilter {

//@Context
//HttpServletRequest webRequest;

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
    //HttpSession httpSession = webRequest.getSession();
    //MyWicketSession mySession = (MyWicketSession) httpSession.getAttribute("wicket:" + BaseConstants.WICKET_FILTER_NAME + ":session");
    //doAuthCheck(mySession, requestContext);
}
...
}

`

前もって感謝します

4

1 に答える 1

10

Jersey 2.4で修正:

import javax.annotation.Priority;
import javax.ws.rs.Priorities;

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthRequestFilter implements ContainerRequestFilter {
    @Context
    HttpServletRequest webRequest;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        final HttpSession session = webRequest.getSession();

        requestContext.setSecurityContext(new SecurityContext() {
            @Override
            public Principal getUserPrincipal() {
                return new PrincipalImpl((String)session.getAttribute("USER_NAME"));
            }

            @Override
            public boolean isUserInRole(String s) {
                return false;
            }

            @Override
            public boolean isSecure() {
                return false;
            }

            @Override
            public String getAuthenticationScheme() {
                return null;
            }
        });
    }
}

@Provider アノテーションを使用せずにフィルターを登録することもできます。

import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;

/**
 * Root REST resource class.
 */
@ApplicationPath("/rest")
public class RootResource  extends ResourceConfig {
    /**
     * Initializes all resources from REST package.
     */
    public RootResource() {
        packages("com.example.rest");
        register(AuthRequestFilter.class);
    }
}

注: Glassfish 4.0.0 は古い Jersey 2.0 を使用します。これらのヒントを使用して Jersey をアップグレードする必要があります(うまく機能することが証明されていません)。または、Glassfish 4.0.1 のナイトリー ビルドをダウンロードすることをお勧めします。しかし、現時点では完全に安定しているわけではありません。新しいバージョンがすぐにリリースされることを願っています。

于 2013-11-05T13:11:02.183 に答える