我有一个Web PHP Web应用程序,其中包含指向Java Web应用程序的链接。 php 应用程序有一个登录页面和一个指向 java 应用程序的链接,但并非每个用户都有权访问 java Web 应用程序。 我试图做的是将用户凭据从 php 应用程序发送到 java 应用程序,然后 java 应用程序检查凭据以及用户日志是否正确。 我正在考虑使用 http 标头来执行此操作。
所以我的问题是如何将用户凭据从 PHP 应用程序发送到 Java 应用程序?
如果有帮助,我正在使用一个名为Vaadin的Java Web框架。
从 PHP 应用程序到 java 应用程序执行正常的 POST 请求。这可以简单地完成,就像在PHP应用程序中使用普通的HTML表单一样,将表单的方法设置为"POST"并将操作设置为Java应用程序的URL。如果要在 Vaadin 应用程序中捕获 HTTP 参数,可以使用请求处理程序 (https://vaadin.com/book/vaadin7/-/page/advanced.requesthandler.html) 来实现。
然后是几句建议或至少要考虑的事情。如果您的登录页面在PHP应用程序中,并且您的"管理员"应用程序是Vaadin应用程序,那么我不建议您在Vaadin应用程序中进行凭据检查。这是因为当您进入 Vaadin 应用程序时,会创建一个新的应用程序实例。这意味着您的 UI 将被初始化,以及您在 UI 的 init 方法中执行的任何其他操作。您可能想要做的是阻止用户进入Vaadin应用程序,除非她已登录 - 这意味着您需要在其他地方进行凭据检查 - 例如,有一个单独的servlet,其唯一职责是登录用户。如果授予登录,则授予对 Vaadin 应用程序的访问权限,如果访问被拒绝,则将用户转发到 PHP 登录屏幕。下一个问题是,您如何阻止用户在登录之前访问 Vaadin 应用程序?通常,这是使用 servlet 过滤器完成的。
我强烈建议您使用第三方框架进行身份验证和授权。看看 http://shiro.apache.org/,它易于安装,似乎与Vaadin配合得很好。您需要做的就是配置它并实现登录屏幕,框架将负责其余的工作。
如果我理解您的问题,您希望能够为登录到PHP应用程序的某些特定用户提供"自动登录链接"。此链接应该会自动将用户登录到 java 应用程序,对吗?
在不知道有关此案例的任何详细信息的情况下,例如两个应用程序是否在同一域上运行,或者它们是否使用相同的数据库(两个应用程序中的用户凭据相同)等,我会提出以下解决方案:
在 java 应用程序上创建一个操作(链接),该应用程序接收创建会话所需的必要参数(作为 GET)(可能 userId 就足够了)、时间戳和所有参数的签名。例如:
http://javaapp.example.com/autologin?userId=123&timeStamp=123456789&sign=hj23kh4j234jk324h
其中签名是使用一些强大的加密算法计算的。然后,验证接收端(java 应用程序)的签名是否正确。如果正确,则创建会话。签名计算可以是这样的:
$signature = sha1($userId . $timeStamp ."一些盐" .$sharedSecretBetweenBothApps);
使用时间戳,您可以检查是否未使用旧链接。例如,不允许超过 15 分钟旧的链接,并将使用的链接存储在 java 应用程序中,以确保它们永远不会被重复使用。您不必保留早于过期时间的链接历史记录。
另一个想法,如评论中所讨论的,是在java端创建一个API,它能够提供一次性链接。
sha1 算法可能不够强大,但显示了这个想法并且易于实现。
这回答了你的问题吗?