2012-12-07 57 views
6

是否有一種方法可以按照以下方式以編程方式添加基於表單的身份驗證? 我正在使用我自己的LdapLoginModule。最初我使用基本身份驗證,它的工作正常,但現在我想更多的控制登錄頁面(如顯示標誌等)Embedded Jetty - 以編程方式添加基於表單的身份驗證

有沒有什麼好的樣本?

我正在使用嵌入式jetty v8.1.7。我不使用任何web.xml嵌入式碼頭。碼頭服務器以編程方式啓動。

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>Test JAAS Realm</realm-name> 
    <form-login-config> 
     <form-login-page>/login.html</form-login-page> 
     <form-error-page>/error.jsp</form-error-page> 
    </form-login-config> 
</login-config> 

回答

11

創建FormAuthenticator併爲ServletContextHandler設置這對你SecurityHandler。這段代碼創建了一個包含2個servlet的普通服務器。第一個servlet使用hello messsage來響應已認證的用戶名。第二個servlet實現了一個簡單的登錄表單。

您應該可以將代碼粘貼到main[]並運行(您需要在類路徑中使用以下jar; jetty-server,jetty-servletjetty-security)。要測試,請在http://localhost:8080處指向瀏覽器,在看到hello username的響應之前,應該提示您輸入憑據(用戶名/密碼)。

Server server = new Server(8080); 
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY); 

context.addServlet(new ServletHolder(new DefaultServlet() { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().append("hello " + request.getUserPrincipal().getName()); 
    } 
}), "/*"); 

context.addServlet(new ServletHolder(new DefaultServlet() { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().append("<html><form method='POST' action='/j_security_check'>" 
     + "<input type='text' name='j_username'/>" 
     + "<input type='password' name='j_password'/>" 
     + "<input type='submit' value='Login'/></form></html>"); 
    } 
}), "/login"); 

Constraint constraint = new Constraint(); 
constraint.setName(Constraint.__FORM_AUTH); 
constraint.setRoles(new String[]{"user","admin","moderator"}); 
constraint.setAuthenticate(true); 

ConstraintMapping constraintMapping = new ConstraintMapping(); 
constraintMapping.setConstraint(constraint); 
constraintMapping.setPathSpec("/*"); 

ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler(); 
securityHandler.addConstraintMapping(constraintMapping); 
HashLoginService loginService = new HashLoginService(); 
loginService.putUser("username", new Password("password"), new String[] {"user"}); 
securityHandler.setLoginService(loginService); 

FormAuthenticator authenticator = new FormAuthenticator("/login", "/login", false); 
securityHandler.setAuthenticator(authenticator); 

context.setSecurityHandler(securityHandler); 

server.start(); 
server.join(); 
+0

沒有設法使它工作... – oshai

+0

謝謝!這對我有幫助,並且我能夠使其工作。 – mwhidden

+2

這是有幫助的,但我想知道你是如何知道這麼做的。 Jetty文檔是...沒有粗魯,稀疏。例如'ConstraintMapping'完全沒有文檔,Google根本沒有提供任何有關它的信息。你是否需要閱讀內部Jetty代碼來學習它? – Timmmm

相關問題