【问题标题】:Jaspic: handle access to a protected resourceJaspic:处理对受保护资源的访问
【发布时间】:2016-12-23 11:14:21
【问题描述】:

我(仍在)学习 JASPIC,通过简单的项目做一些实验:this one。当我调用受保护资源ServerAuthModule 通过validateRequest 检查凭据并返回AuthStatus.SUCCESS。 HTTP 响应是 200,但它是空的。我用这两个curl命令来测试:

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 示例。

【问题讨论】:

  • 请提供更多信息,例如响应的状态(如果您收到一个)和任何相关的日志条目。另外,我怀疑您是否需要 web.xml 中的 <login-config> 元素。

标签: jakarta-ee jaspic


【解决方案1】:

SAM 的CallbackHandler 是造成您麻烦的原因。

首先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 容器在这种情况下试图让双方都满意,一方面通过尊重 SAM 的 AuthStatus 表明成功的身份验证消息交换,以及应用程序的 <security-constraint>在另一。诚然,401403,或者更好的是,500 响应——表明身份验证机制不遵守其合同——可能不会那么混乱。

显而易见的解决方案是将 runtime-provided 处理程序传递给 SAM。 API 显然没有多大帮助,但对于单个消息层/单个应用程序/单个身份验证机制用例,只需懒惰地实例化 ServerAuthConfig with 处理程序就足够了,当它运行时首先通过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-11-26
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2018-07-22
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多