JAX-RS 中的简单自定义身份验证器
Simple custom authenticator in JAX-RS
在 JAX-RS(或 Jersey)REST 服务中,我正在尝试为数据库中的用户进行自定义身份验证。
目前我有 @GET 注释方法,它应该与用户交互,要求提供凭据,就像在 Spring 框架中使用身份验证提供程序所做的那样 - 没有自定义登录表单,只是使用浏览器弹出表单的普通 HTTP 登录。
目前我可以处理 header 中提供的 HTTP 基本访问身份验证,但我需要在交互访问内容之前请求凭据,然后在此基础上进行 token-based 身份验证。
我必须保留应用程序 light-weight 但我不知道如何完成此 "easy" 任务..
编辑:我在 Wildfly 配置中找到了一些东西(我使用的是 9 Final 版本),但我不知道如何使用它来使用数据源登录..
如果您已经可以处理 HTTP Basic 身份验证,那么您只需要从浏览器获取一个 "login form"?我们通过实现 javax.ws.rs.ext.ExceptionMapper 并覆盖 toResponse(Throwable ex) 来解决这个问题。我们的应用抛出一个 NotAuthenticatedException,它被映射到 javax.ws.rs.core.Response.Status.UNAUTHORIZED。然后我们适当添加一个响应header:
@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();
}
重要的部分是在用户未登录时设置响应 header,这会使浏览器显示 HTTP 基本登录对话框。
在 JAX-RS(或 Jersey)REST 服务中,我正在尝试为数据库中的用户进行自定义身份验证。 目前我有 @GET 注释方法,它应该与用户交互,要求提供凭据,就像在 Spring 框架中使用身份验证提供程序所做的那样 - 没有自定义登录表单,只是使用浏览器弹出表单的普通 HTTP 登录。
目前我可以处理 header 中提供的 HTTP 基本访问身份验证,但我需要在交互访问内容之前请求凭据,然后在此基础上进行 token-based 身份验证。
我必须保留应用程序 light-weight 但我不知道如何完成此 "easy" 任务..
编辑:我在 Wildfly 配置中找到了一些东西(我使用的是 9 Final 版本),但我不知道如何使用它来使用数据源登录..
如果您已经可以处理 HTTP Basic 身份验证,那么您只需要从浏览器获取一个 "login form"?我们通过实现 javax.ws.rs.ext.ExceptionMapper 并覆盖 toResponse(Throwable ex) 来解决这个问题。我们的应用抛出一个 NotAuthenticatedException,它被映射到 javax.ws.rs.core.Response.Status.UNAUTHORIZED。然后我们适当添加一个响应header:
@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();
}
重要的部分是在用户未登录时设置响应 header,这会使浏览器显示 HTTP 基本登录对话框。