2012-12-07 40 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

相关问题