java—如何从jax ws webservice中的编程授权检查返回正确的http状态代码?

2admgd59  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(275)

我在jboss eap 6(jboss as 7)上部署了一个类似以下简化示例的Web服务:

@Stateless
@RolesAllowed("basic_role")
@WebService(name = "MyWebService", serviceName = "MyWebService")
@WebContext(contextRoot = "api", urlPattern = "/MyWebService", authMethod = "BASIC")
public class MyWebService {

    @Resource
    private WebServiceContext webServiceContext;

    @WebMethod
    public void doSomething(String parameter) {
        System.out.println(webServiceContext.getUserPrincipal());
        if (!webServiceContext.isUserInRole("role_for_parameter_" + parameter)) {
            throw new HTTPException(401);
        }
    }
}

我想根据传入的参数进行权限检查,但不知道如何正确返回401状态码。如果调用者没有提供任何凭证,或者提供的用户没有“基本\角色”,则服务器将按预期返回401。但是一旦我的代码被调用,如果我抛出任何类型的异常,就会返回一个状态码500。我以为这就是httpexception的用途,但是如果我使用httpexception、runtimeexception或者我尝试过的任何其他异常,这都没有区别。
我唯一能想到的办法是:

@WebMethod
public void doSomething(String parameter) {
    System.out.println(webServiceContext.getUserPrincipal());
    if (!webServiceContext.isUserInRole("role_for_parameter_" + parameter)) {
        HttpServletResponse response = (HttpServletResponse)webServiceContext.getMessageContext().get(MessageContext.SERVLET_RESPONSE);
        try {
            response.sendError(401, "Not authorized");
            throw new RuntimeException("Not authorized");
        }
        catch (IOException e) {
            throw propagate(e);
        }
    }
}

通过这种方式,401状态代码被返回,但是我也需要抛出异常以防止进一步的处理,而且从日志来看,jax-ws试图返回一个带有runtimeexception的500,但是它不能,因为响应已经提交了。这似乎不是一个干净的方法。

ar7v8xwq

ar7v8xwq1#

不确定这是不是最好的方法,但对我来说很有效:

webServiceContext.getMessageContext()
     .put(MessageContext.HTTP_RESPONSE_CODE, HttpStatus.UNAUTHORIZED_401);
return;

相关问题