ここ数日かそこらで、組み込みの jetty サーバーを実行しようとしていますが、セキュリティ ハンドラーを思いどおりに構成できません。
初期化コードは次のようになります。
interfaceServer = new Server(configManager.getServerPort());
// Initializing the security handler
ServletContextHandler appContext = new ServletContextHandler(interfaceServer, "/", ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY);
// SECURITY HANDLER
ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
securityHandler.setConstraintMappings(getConstraintMappings());
securityHandler.setLoginService(getLoginService());
securityHandler.setAuthenticator(getAuthenticator());
securityHandler.setCheckWelcomeFiles(true);
// Set security
appContext.setSecurityHandler(securityHandler);
appContext.setResourceBase(webDir);
appContext.setWelcomeFiles(new String[] {"gui.tmpl"});
// Add servlets
appContext.addServlet(new ServletHolder(new SyncServlet(systemOutBypass)), "/sync");
appContext.addServlet(new ServletHolder(new CommandServlet(configManager)), "/exec");
appContext.addServlet(new ServletHolder(new ConfigServlet(configManager)), "/conf");
appContext.addServlet(new ServletHolder(new FeedServlet(configManager)), "/feed");
appContext.addServlet(new ServletHolder(new ProxyServlet(configManager)), "/proxy");
appContext.addServlet(new ServletHolder(new BrowseServlet(configManager)), "/browse");
appContext.addServlet(DefaultServlet.class, "/");
// Apply to server
interfaceServer.setHandler(appContext);
interfaceServer.start();
ヘルパー関数:
private static ConstraintMapping[] getConstraintMappings() {
// CONSTRAINT
Constraint constraint = new Constraint();
constraint.setName(Constraint.__FORM_AUTH);
constraint.setRoles(new String[]{"user", "admin"});
constraint.setAuthenticate( true );
// MAPPINGS
ConstraintMapping mapping = new ConstraintMapping();
mapping.setPathSpec( "*.tmpl" );
mapping.setConstraint( constraint );
return new ConstraintMapping[] {mapping};
}
private static LoginService getLoginService(){
// HASH LOGIN SERVICE
HashLoginService loginService = new HashLoginService();
loginService.putUser("admin", new Password("admin"), new String[] {"user"});
return loginService;
}
private static Authenticator getAuthenticator(){
// FORM AUTH
return new FormAuthenticator("/login.tmpl", "/login.tmpl", false);
}
http://127.0.0.1:8083/gui.tmpl
このように構成すると機能しますが、入力した場合にのみログインページにリダイレクトされますhttp://127.0.0.1:8083/
gui.tmpl ファイルを表示しますが、他のすべてのものをロードせず、リダイレクトしません.. setPathSpec パスを "/ " セキュリティはアプリ全体に適用されますが、静的ファイルにアクセスできないため、ログイン フォームはスタイル設定されません (インライン CSS でスタイル設定する必要があります)。
必要な動作は、フォルダーまたは一連のファイルと、css、画像などのアクセス可能な静的ファイルにのみ適用されるセキュリティです。それは可能ですか? そうでない場合、唯一の解決策はインライン スタイルですか? 助けてください!
完全なプロジェクトはBitbucketの実験的ブランチで見つけることができます(場合によってはマスターもチェックしてください..)