gpt4 book ai didi

java - 如何在 JASPIC 中保存经过身份验证的用户?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:44:30 25 4
gpt4 key购买 nike

我开发了一个安全认证模块 (SAM) 并实现了 validateRequest 方法。我还有一个配置为使用此 SAM 的简单网络应用程序。

在我的 validateRequest 方法中,我检查 clientSubject 并设置一个带有硬编码用户名的 CallerPrincipalCallback 和一个带有硬编码组名的 GroupPrincipalCallback:

final CallerPrincipalCallback callerPrincipalCallback = new CallerPrincipalCallback(clientSubject, "anonymous");
final GroupPrincipalCallback groupPrincipalCallback = new GroupPrincipalCallback(clientSubject, new String[] {"user"});

try {
this.handler.handle(new Callback[] {callerPrincipalCallback, groupPrincipalCallback});
} catch (IOException | UnsupportedCallbackException e) {
logger.error(e.getMessage());
}

我注意到每次我在我的 webapp 中刷新一个 servlet 时,客户端主题只是空白,logger.debug("Client: {}", clientSubject);:

2015-05-05 11:21:02,200 DEBUG n.m.j.s.Saml2AuthModule [http-listener-1(2)] Client: Subject:

是否有可能以某种方式“保存”主题,以便将主题附加到 session 中,并且我可以简单地跳过每次登录同一用户?

编辑 我想我通过手动将其存储在HttpSession 中找到了一种方法:req.getSession().setAttribute("subject", user); 不漂亮,但它有效。

最佳答案

Is it possible to "save" a subject somehow so that the subject is attached to the session and I can simply skip logging in the same user every time?

是的,虽然 JASPIC 被设计为无状态的,但它确实有一个选项可以半自动记住登录。

不过,与仅将详细信息存储在 session 中并在每个请求开始时重新进行身份验证相比,此选项的代码并没有减少多少。

执行此操作的方法是在返回 SUCCESS 并退出 validateRequest 之前首先在消息信息映射中设置一个 boolean 值:

messageInfo.getMap().put("javax.servlet.http.registerSession", TRUE.toString());

然后在每个请求开始时,您的身份验证模块 (SAM) 仍会被调用,但您可以执行以下“协议(protocol)”以重新使用存储的身份数据(用户名 + 角色):

HttpServletRequest request = (HttpServletRequest) messageInfo.getRequestMessage();
Principal userPrincipal = request.getUserPrincipal();

if (userPrincipal != null) {
handler.handle(new Callback[] {
new CallerPrincipalCallback(clientSubject, userPrincipal) }
);

return SUCCESS;
}

我写了一个blog entry有更多细节。您可以在 Java EE 7 samples project 中找到使用完整示例的测试。 .

不幸的是,只要 (http) session 有效,JASPIC 中没有任何功能表明您根本不想调用 SAM。

如果您喜欢此功能,请为以下问题投票:https://java.net/jira/browse/JASPIC_SPEC-20

I think I found a way by manually storing it in the HttpSession: req.getSession().setAttribute("subject", user); Not pretty, but it works.

或多或少的“官方”方法是将用户名和角色存储在 session 中,然后在每次调用 validateRequest 开始时检查此数据是否存在,如果存在则将其移交到两个回调。

我上面展示的方法并没有什么不同,但除了明显的区别(一个回调与两个,从请求中获取主体与从 session 中获取主体)之外,主要区别在于通过半自动方式容器可以自由使用任何它必须存储数据的机制。

这可能只是 session 中的一个属性(一个简单的 JASPIC 实现肯定可以做到这一点),或者它可以使用大多数容器具有的 session 的一些隐藏部分。用户代码无法直接访问此隐藏部分,这可能具有一些优势。

关于java - 如何在 JASPIC 中保存经过身份验证的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30050038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com