1

我(仍在)研究 JASPIC,通过简单的项目做一些实验:这个。当我调用受保护的资源时,通过并返回ServerAuthModule检查凭据。HTTP 响应是 200 但它是空的。我使用这两个命令来测试:validateRequestAuthStatus.SUCCESScurl

curl -H "Content-Type: application/json" -X POST -d '{"username":"xxx","password":"xxx"}' http://localhost:8080/JaspicWeb/services/user/login
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzE0NzE1ODcsInN1YiI6InVzZXJBIn0.Gyf7w2192vlz3uSwjwtf8z1p9n9k3IqtQMQrubA7oYI" -X GET http://localhost:8080/JaspicWeb/services/user/userA

第一个命令是获取第二个命令中使用的令牌。我将 Jaspic 与 Wildfly10 和 RestEasy 一起使用。

更新: 我更新了链接项目。现在它是一个完整的工作Jaspic示例。

4

1 回答 1

1

SAMCallbackHandler是造成您麻烦的原因。

首先it.jaspic.sec.TokenConfigProvider忽略运行时传递给它的处理程序:

public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException {
  return serverAuthConfig;
}

然后it.jaspic.sec.TokenServerConfig使用它自己的处理程序,它基本上什么都不做:

public TokenServerConfig() throws AuthException {
  // ...
  handler = new CallbackHandler() {
    @Override
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
      // just logs its arguments
    }
  };
}

因此,it.jaspic.sec.TokenSAM#validateRequest无法将调用者的身份传达给运行时。由于它仍然错误地返回AuthStatus.SUCCESS,从那时起它几乎是未定义的行为,至少就 JASPIC 而言。有趣的是,在这种情况下,好像 Servlet 容器试图让双方都满意,AuthStatus一方面尊重表明成功的身份验证消息交换的 SAM,另一方面尊重应用程序<security-constraint>。诚然,一个401,403或者更好的500响应——表明身份验证机制不遵守其契约——可能不那么令人困惑。

显而易见的解决方案是将运行时提供的处理程序传递给 SAM。API 显然没有多大帮助,但对于单个消息层/单个应用程序/单个身份验证机制用例,当运行时首次通过调用请求它时,只需ServerAuthConfig 使用处理程序延迟实例化就足够了:getServerAuthConfig

public synchronized ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) {
  if (serverAuthConfig == null) {
    serverAuthConfig = new TokenServerConfig(handler);
  }
  return serverAuthConfig;
}

当然,上面调用的新构造函数(它只需要存储处理程序参数)必须被引入it.jaspic.sec.TokenServerConfig.

这两个更改应该使/services/user/userA端点可访问。

于 2016-08-19T12:08:49.540 回答