【问题标题】:Simple custom authenticator in JAX-RSJAX-RS 中的简单自定义身份验证器
【发布时间】:2015-07-16 12:04:05
【问题描述】:
在 JAX-RS(或 Jersey)REST 服务中,我正在尝试为数据库中的用户进行自定义身份验证。
目前我有 @GET 注释方法,它应该与用户请求凭据进行交互,就像它在 Spring 框架中使用身份验证提供程序一样 - 没有自定义登录表单,只是带有浏览器弹出表单的普通 HTTP 登录。
目前我可以处理标头中提供的 HTTP 基本访问身份验证,但我需要在交互访问内容之前询问凭据,然后在此基础上进行基于令牌的身份验证。
我必须保持应用程序的轻量级,但我不知道如何完成这个“简单”的任务..
编辑:我在 Wildfly 配置中找到了一些东西(我使用的是 9 最终版本),但我不知道如何使用它来使用数据源登录。..
【问题讨论】:
标签:
authentication
jakarta-ee
jax-rs
wildfly
【解决方案1】:
如果您已经可以处理 HTTP Basic 身份验证,那么您只需要从浏览器获取一个“登录表单”吗?我们通过实现 javax.ws.rs.ext.ExceptionMapper 并覆盖 toResponse(Throwable ex) 解决了这个问题。我们的应用程序抛出一个 NotAuthenticatedException,它被映射到 javax.ws.rs.core.Response.Status.UNAUTHORIZED。然后我们适当地添加一个响应头:
@Provider
public class RESTExMapper implements ExceptionMapper<Throwable>
{
@Override
public Response toResponse(Throwable ex)
{
//our application maps a not logged in exception to javax.ws.rs.core.Response.Status.UNAUTHORIZED in this Pair
Pair<Integer, ObjectMap> ret = buildResponse( unwrap( ex));
ResponseBuilder rb = Response.status( ret.left()).entity( ret.right()).type( "application/json");
if( ret.left() == UNAUTHORIZED.getStatusCode())
return rb.header( HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"YOUR SERVICE NAME\"").build();
else
return rb.build();
}
如果用户未登录,重要的部分是设置响应标头,这会使浏览器显示 HTTP 基本登录对话框。