java 如何使用Jetty提示用户进行基本身份验证

6ie5vjzr  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(111)

我的目标是通过编程来配置一个带有BASIC身份验证的Jetty服务器。我已经设法让身份验证在使用像Postman这样的REST客户端时工作,并且总是发送身份验证头,但我希望用户在打开页面时使用Browaswers本地登录提示符提示输入。
下面的代码是我的当前状态。响应(401)和标题确实包括“WWW-Authenticate:basic realm=“thwCopRealm”",所以我不明白为什么不提示用户输入。
你能帮我配置服务器,这样用户将被提示使用浏览器本地登录提示登录吗?

Server server = new Server(8080);

HashLoginService loginService = new HashLoginService();
loginService.setName(REALM);
loginService.setConfig(Main.class.getResource("/users.txt").toString());

Constraint constraint = new Constraint(Constraint.__BASIC_AUTH, Roles.USER);
constraint.setAuthenticate(true);

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

ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
securityHandler.setAuthenticator(new BasicAuthenticator());
securityHandler.setRealmName(REALM);
securityHandler.setLoginService(loginService);
securityHandler.addRole(Roles.ADMIN);
securityHandler.addRole(Roles.USER);
securityHandler.addConstraintMapping(constraintMapping);

ExampleServlet copServlet = new ExampleServlet();
ServletHolder copServletHolder = new ServletHolder(copServlet);
    
ServletContextHandler handler = new ServletContextHandler();
handler.addServlet(copServletHolder, "/cop");        
handler.setSecurityHandler(securityHandler);

server.addBean(loginService);
server.setHandler(handler);
zqdjd7g9

zqdjd7g91#

在发布这个问题几分钟后,我发现我的域管理员为了安全起见在我们的PC上禁用了基本身份验证提示(这是有道理的)。
我通过修改两行代码实现了我的目标:成为一个文摘而不是基础。

Constraint constraint = new Constraint(Constraint.__DIGEST_AUTH, Roles.USER);
securityHandler.setAuthenticator(new DigestAuthenticator());

背景是Basic在许多情况下都非常不安全。它太容易丢失登录数据了,任何有信誉的服务器都应该使用更安全的东西。

相关问题