在HttpServletRequest.login()之后获取授权令牌

时间:2015-06-05 08:33:06

标签: java-ee servlets websphere-8 ltpa

在我们的web应用程序中,我们需要在成功登录后将身份验证令牌(LtpaToken2(websphere),JSESSIONID(tomcat))存储在外部数据存储区中。我希望在登录HttpServletRequest对象后检索令牌。

        LOG.debug("nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size());
        request.login(employee.getUsername(), employee.getPassword());
        URI uri = info.getBaseUri().resolve("/login2");
        LOG.debug("new uri is: '"+ uri + "' nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size());
        // Add the Higgs Cookie

日志输出表示标题的cookie数量不变。是否有另一种方法可以在登录完成后在同一请求中检索身份验证令牌,最好是平台独立的?我可能可以进行重定向并从下一个请求中读取令牌,但我担心这会带来一些额外的安全威胁。

1 个答案:

答案 0 :(得分:1)

您想要存储该Cookie的任何原因?由于它在特定超时后发生变化,因此存储它不会提供太多价值。您可以使用以下代码从请求中访问它。

身份验证令牌是Cookie而不是标头。您必须使用以下代码访问它(此代码在成功验证后的任何页面中都有效):

Cookie cookies[] = request.getCookies();
for(Cookie c : cookies){
    if("LtpaToken2".equals(c.getName())) {
        // do something with ltpa cookie
        out.println(c.getName() + " : " + c.getValue());
    }
}

<强>更新
要在执行登录的servlet中获取令牌,请使用以下代码:

Set<Object> credentials = WSSubject.getRunAsSubject().getPrivateCredentials();
for (Object credential : credentials) {
    if(credential instanceof SingleSignonToken) {
        SingleSignonToken token = (SingleSignonToken)credential;
        System.out.println(token.getName());
        System.out.println(token.getUniqueID());
        System.out.println(token.getPrincipal());
        System.out.println("LTPA Token encoded: " + Base64.encode(token.getBytes()));
    }
}