【问题标题】: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 基本登录对话框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2016-06-08
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      相关资源
      最近更新 更多