我已经开发了一个安全身份验证模块(SAM)并实现了validateRequest
方法。我也有一个简单的Web应用程序配置用于使用此SAM。
在我的validateRequest
方法中,我检查了clibterubject,并设置了带有硬编码用户名的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:
是否可以以某种方式"保存"一个主题,以便将主题附加到会话上,我可以每次都跳过同一用户的记录?
edit 我想我通过手动存储在 HttpSession
中找到了一种方法: req.getSession().setAttribute("subject", user);
不漂亮,但起作用。
是否可以以某种方式"保存"一个主题,以便将主题附加到会话上,我可以每次都跳过同一用户的记录?
是的,尽管jaspic被设计为无状态,但它确实可以选择半自动物记住登录。
此选项并不比仅在会话中存储详细信息并在每个请求开始时重新验证详细信息的代码要少得多。
。这样做的方法是在返回成功并退出validateRequest
之前首先在消息信息映射中设置布尔值:
messageInfo.getMap().put("javax.servlet.http.registerSession", TRUE.toString());
然后在每个请求开始时仍调用您的身份验证模块(SAM),但是您可以执行以下"协议"以重新使用存储的身份数据(用户名 角色):
HttpServletRequest request = (HttpServletRequest) messageInfo.getRequestMessage();
Principal userPrincipal = request.getUserPrincipal();
if (userPrincipal != null) {
handler.handle(new Callback[] {
new CallerPrincipalCallback(clientSubject, userPrincipal) }
);
return SUCCESS;
}
我写了一个博客条目,其中包含更多详细信息。您可以在Java EE 7样本项目中找到使用完全工作示例的测试。
不幸的是,只要(http)会话有效,jaspic中没有任何功能可以说您不想将SAM打电话。
如果您关心此功能,请投票给以下问题:https://java.net/jira/browse/jaspic_spec-20
我认为我通过手动将其存储在httpsession中找到了一种方法:req.getSession()。setAttribute("主题",用户);不漂亮,但是可以工作。
或多或少,"官方"方法是将用户名和角色存储在会话内,然后在每个呼叫的 validateRequest
开始时检查此数据是否存在,如果是这样,则将其交给两个回调。p>我上面显示的方法并没有什么不同,但是除了明显的差异(一个回调与两个,从请求中获取主体与从会话中获取校长)的主要区别是,通过半自动方法该容器可以免费使用其必须存储数据的任何机制。
这可能只是会话中的一个属性(可以肯定的是简单的jaspic实现),也可以使用大多数容器所具有的会话的某些隐藏部分。用户代码无法直接访问该隐藏的部分,这可能具有一些优势。