Embedded Jetty - 以编程方式添加基于表单的身份验证

msn*_*3ka 6 java forms-authentication ldap jetty

有没有办法以编程方式添加基于表单的身份验证,如下所示?我正在使用自己的LdapLoginModule.最初我使用基本身份验证,它工作正常,但现在我想要更多控制登录页面(如显示徽标等)

有什么好样品吗?

我正在使用嵌入式jetty v8.1.7.我没有对嵌入式jetty使用任何web.xml.jetty服务器以编程方式启动.

<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>
Run Code Online (Sandbox Code Playgroud)

小智 11

创建一个FormAuthenticator并设置SecurityHandler为你的ServletContextHandler.此代码创建一个包含2个servlet的普通服务器.第一个servlet以经过身份验证的用户名的hello messsage响应.第二个servlet实现了一个简单的登录表单.

你应该能够将代码粘贴到一个main[]与运行(您需要在您的类路径下面罐; 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();
Run Code Online (Sandbox Code Playgroud)

  • 这很有帮助,但我想知道你是怎么知道的.Jetty文档是......没有粗鲁,稀疏.例如,"ConstraintMapping"完全没有记录,谷歌根本不提供任何有关它的信息.您是否必须阅读内部Jetty代码才能学习它? (2认同)