java - 验证服务器之间的用户请求

标签 java authentication servlets session-state tomcat8

背景:我正在创建一个文件服务器。我在 Nginx 反向代理后面使用 Tomcat。我有一个托管 UI 的主服务器和许多边缘服务器,我希望在其中存储用户上传的文件并将其返回。这是一个私有(private)文件存储,因此只有文件上传者才能下载其上传的文件。

问题:当用户登录到他们的帐户时,我通过创建 session 来验证主服务器上的用户身份,并保留它以验证用户的进一步请求(常规内容)。此信息不会分配给边缘服务器,边缘服务器会根据任何请求提供文件。那不是我想要的。我只想授权文件所有者下载。

现在,我试图避免 Tomcat 集群,其中边缘和主服务器配置为具有分布式 session 的集群。站点支持 SSL。当文件下载请求从已登录(创建 session )主服务器的用户到达边缘服务器时,是否有方法验证用户的登录状态?

最佳答案

我看到了几种可以使用的方法

您可以使用“基于声明的身份验证”或资源访问 token 的形式。

基于声明的身份验证 - 您可以使用例如JWT token ,应包含一些必要的信息(用户 ID、帐户 ID、授权、过期等),并由共享 key (主服务器和文件服务器之间)或来自主服务器的私钥签名。

优点是边缘服务器可以根据哈希或签名验证 token ,而无需联系主服务器。缺点是,必须有逻辑来决定用户是否有权访问所请求的资源。

参见:https://jwt.io/

资源访问 token - 这种方法用于某些云存储提供商(AWS S3、IBM 对象存储等) - 主站点将返回带有一些额外参数的资源 URL - 例如帐户、随机数、到期时间、签名。资源(边缘)服务器必须检查过期和签名并提供或拒绝资源

优点是,边缘服务器不关心任何身份验证,并且身份验证和授权完全在主服务器的范围内。缺点是,提供的资源 URL 必须有有限的过期时间。

参见:http://s3-expiry.50projects.com/

注意:

  • 设置资源服务器可能无法与主服务器有效通信的条件后,您将无法检查用户是否已登录,除非使用带有 SLO(单点注销)的 SAML SSO 或带有 session 管理的 OIDC

关于java - 验证服务器之间的用户请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42717882/

相关文章:

node.js - 登录失败环回验证

security - 使用 _session 进行身份验证

javascript - 如何将客户端TimezoneOffset放入初始请求中?

java - 单例 Servlet 过滤器

Java EE : Getting parameters from POST for a login form

java - 如何在java反射中获取注解值

sql-server - 从域管理员保护 SQL Server 数据库

java - reSTLet 引擎中带有长字符串的 Pattern.match 的 StackoverflowError

java - 适用于 Java 的 Google Http 客户端 : Ignore java. security.cert.CertPathValidatorException:未找到证书路径的信任 anchor

java - 如何在浏览器上显示提交到数据库的图像?