Jaspic:处理对受保护资源的访问
Jaspic: handle access to a protected resource
我(仍在)研究 JASPIC,通过简单的项目做一些实验:this one。当我调用受保护资源时,ServerAuthModule
通过 validateRequest
和 returns 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
示例。
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
无法将调用者的身份传达给运行时。由于它仍然错误地 returns AuthStatus.SUCCESS
,从那时起它几乎是未定义的行为,至少就 JASPIC 而言是这样。有趣的是,在这种情况下,Servlet 容器似乎试图让双方都满意,一方面是通过尊重 SAM 的 AuthStatus
表明成功的身份验证消息交换,另一方面是应用程序的 <security-constraint>
另一方面。诚然,401
、403
,或者更好的是,500
响应——表明身份验证机制不遵守其合同——可能不会那么令人困惑。
显而易见的解决方案是将 运行时提供的 处理程序传递给 SAM。 API 显然没有多大帮助,但对于单个消息 layer/single app/single 身份验证机制用例,只需延迟实例化 ServerAuthConfig
[=41] 就足够了=]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
端点可访问。
我(仍在)研究 JASPIC,通过简单的项目做一些实验:this one。当我调用受保护资源时,ServerAuthModule
通过 validateRequest
和 returns 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
示例。
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
无法将调用者的身份传达给运行时。由于它仍然错误地 returns AuthStatus.SUCCESS
,从那时起它几乎是未定义的行为,至少就 JASPIC 而言是这样。有趣的是,在这种情况下,Servlet 容器似乎试图让双方都满意,一方面是通过尊重 SAM 的 AuthStatus
表明成功的身份验证消息交换,另一方面是应用程序的 <security-constraint>
另一方面。诚然,401
、403
,或者更好的是,500
响应——表明身份验证机制不遵守其合同——可能不会那么令人困惑。
显而易见的解决方案是将 运行时提供的 处理程序传递给 SAM。 API 显然没有多大帮助,但对于单个消息 layer/single app/single 身份验证机制用例,只需延迟实例化 ServerAuthConfig
[=41] 就足够了=]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
端点可访问。