3

Jetty サーバーで自分のページの 1 つの認証を提供しようとしています。私はすべてプログラムで行っているので、xml は関係ありません。

ConstraintSecurityHandler を使用すると、特定のコンテキストを保護できることがわかりました。これは私が実行しているサーブレットでは問題なく機能しますが、ResourceHandler でも機能するように拡張しようとしましたが、問題が発生しました。私が試しているコードは以下にあります。

最初に ResourceHandler ブロックを配置すると、認証がポップアップしません。ResourceHandler ブロックを SecurityHandler ブロックの後に配置すると、認証がポップアップ表示されますが、認証後に ResourceHandler ページ (/resources) が表示されず、Jetty から 404 が返されます。

ResourceHandler によってホストされているページをプログラムでパスワード保護する方法はありますか?

final static String REALM = "REALM";

.
.
.

public static void main(String[] args){   
.
.
.
    ResourceHandler resourceHandler = new ResourceHandler(); //set up resourceHandler to host directory of files at /resources
    resourceHandler.setDirectoriesListed(true);
    resourceHandler.setResourceBase("." + File.separator + "files");
    ContextHandler resourceContextHandler = new ContextHandler();
    resourceContextHandler.setContextPath("/resources");
    resourceContextHandler.setHandler(resourceHandler);
    handlers.addHandler(resourceContextHandler);
.
.
.
    ConstraintSecurityHandler csh = getConstraintSecurityHandler();
    ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContextHandler.setSecurityHandler(csh);
    handlers.addHandler(servletContextHandler);
.
.
.

    server.setHandler(handlers);
    server.start();
    server.join();
}

private ConstraintSecurityHandler getConstraintSecurityHandler(){
    Constraint constraint = new Constraint(Constraint.__BASIC_AUTH, "user");
    constraint.setRoles(new String[]{"user","admin"});
    constraint.setAuthenticate(true);

    ConstraintMapping statsConstraintMapping = new ConstraintMapping();
    statsConstraintMapping.setConstraint(constraint);
    statsConstraintMapping.setPathSpec("/resources"); //directory I want to protect

    ConstraintSecurityHandler csh = new ConstraintSecurityHandler();
    csh.setAuthenticator(new BasicAuthenticator());
    csh.setRealmName(REALM);
    csh.setConstraintMappings(new ConstraintMapping[] {statsConstraintMapping});

    csh.setLoginService(getHashLoginService());

    return csh;
}

private HashLoginService getHashLoginService() {
    HashLoginService loginServ = new HashLoginService();
    loginServ.setName(REALM);
    loginServ.setConfig("realm.properties"); //location of authentication file
    loginServ.setRefreshInterval(1);
    return loginServ;
}
4

1 に答える 1

4

セキュリティ ハンドラはリソース ハンドラの前にあるため、一連の処理ではセキュリティ ハンドラが最初に参照されます。

見る:

https://github.com/eclipse/jetty.project/blob/master/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SecuredHelloHandler.java

于 2012-07-13T21:40:35.427 に答える