Java 如何从Liferay MVC Porlet触发自动登录

Java 如何从Liferay MVC Porlet触发自动登录,java,authentication,liferay,portal,Java,Authentication,Liferay,Portal,我已经在一个钩子中实现了自动登录,所以我可以通过在url中发送登录参数来登录 我试图避免在url中以纯文本形式发送这些参数的情况。有没有办法从MVCPortlet操作方法触发自动登录?我已尝试在操作响应中设置参数,但在自动登录钩子的login()方法中,这些参数始终为空 行动类: public void triggerLogin(ActionRequest actionRequest, ActionResponse actionResponse) { actionResp

我已经在一个钩子中实现了自动登录,所以我可以通过在url中发送登录参数来登录

我试图避免在url中以纯文本形式发送这些参数的情况。有没有办法从MVCPortlet操作方法触发自动登录?我已尝试在操作响应中设置参数,但在自动登录钩子的
login()
方法中,这些参数始终为空

行动类:

public void triggerLogin(ActionRequest actionRequest,
        ActionResponse actionResponse) {
    actionResponse.setRenderParameter("userEmail", user.getEmail());
    actionResponse.setRenderParameter("password", user.getPassword());
}
登录挂钩:

@Override
public String[] login(HttpServletRequest request, HttpServletResponse response) throws AutoLoginException {

    String email = request.getParameter("userEmail"); // null
    String password = request.getParameter("password"); // null

    // email and password are null
}
我还尝试将其设置在
HttpServletResponse
上,如下所示:

PortalUtil.getHttpServletResponse(
    actionResponse).setHeader("userEmail", user.getEmail());

有没有一种方法可以在不将密码发送到前端的情况下执行此操作?

这里有几项是值得怀疑的-从安全角度来看,第一项是您似乎在自己的portlet中处理用户名/密码-我无法理解您为什么要在为您处理所有身份管理的平台上执行此操作,但你可能有你的理由。我觉得这个评论是有必要的,即使你可能有一个很好的理由,因为95%的其他理由(后来读到这篇文章的人)都不好

这就是说,有一个-这很容易调整为需要-而不是用户名/密码-您甚至可以对当前会话进行哈希/签名或以其他方式保护,以便您可以自动登录在自定义操作中已验证的任何用户。我不知道在服务器和浏览器之间来回发送nonce是否可以解决您的问题

最后,关于
portal.getHttpServletResponse
,我不确定这样的响应头应该做什么。如果有的话,你会告诉浏览器的电子邮件地址,但没有别的


有了这些PortalTil类并返回到HttpServletRequest/-Response,我很少看到它们做了别人期望的事情。在门户世界中,这一层被牢牢屏蔽,远离您。但是如果你想使用它,有一个重要的区别:我在过去写过一篇关于
PortalTil.getHttpServletRequest
及其姐妹调用
PortalTil.getOriginalHttpServletRequest
——这个答案肯定没有什么,但它可能有助于解决这个问题(我希望它不会混淆)

谢谢奥拉夫。我正在尝试在登录过程中添加一个额外的步骤,用于双因素身份验证。我希望在实际的登录钩子而不是portlet中完成身份验证,这就是我试图触发自动登录的原因。不幸的是,它似乎必须是一个GET请求。看来我无法避免在url中传递某种令牌。感谢您的输入。好吧,将该令牌设为一个令牌,将其绑定到会话,确保您使用的是https,即使在日志中找到,也没有人能够使用它。