如何将经过身份验证的用户(主体)信息添加到ChannelHandlerContext(或其他任何地方?)

时间:2012-03-20 21:01:41

标签: authentication netty

简而言之,我正在进行双向SSL,客户端证书用于识别我的最终用户。 SSLHandler做得很好,SSLHandler知道关于该主体的所有信息。如何与其他处理程序共享该信息,以便他们可以在整个渠道管道中完成工作?

这是我的SSLHandler扩展程序找到用户主体的位置......

...

类MySslHandler扩展了SSLHandler {....

public void messageReceived(
        ChannelHandlerContext ctx, MessageEvent e) throws Exception{
    logger.info("messageReceived");
    super.messageReceived(ctx, e);
        try{
                System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! " + getPrincipalCertificate().getSubjectDN().toString());
                        }
                        catch(Throwable t){
                            logger.error("Unable to see principal ", t);
                        }        

}    
/**
 * 
 * @return Return the user certificate of the principal
 * @throws SSLPeerUnverifiedException  if the peer is not yet verified
 */
public X509Certificate getPrincipalCertificate() throws SSLPeerUnverifiedException{
    return getEngine().getSession().getPeerCertificateChain()[0];
}

}

我可能应该向ChannelHandlerContext添加信息,以便它可以在SSL会话期间和我所有其他处理程序中使用,但我无法弄清楚如何做到这一点。这是错误的方法吗?有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您需要在ChannelHandler之间共享它,则需要使用静态ChannelLocal实例。因为ChannelHandlerContext是每个ChannelHandler所必需的。

请参阅http://netty.io/docs/stable/api/org/jboss/netty/channel/ChannelLocal.html