我们正在使用 swing 编写一个带有富 GUI 客户端的三层应用程序,我们需要添加一些身份验证和授权控制。我对这个主题完全陌生,所以我在网上做了一些研究。我的第一个意图是将 JAAS 用于此功能,但据我所知,JAAS 仅包含执行特权方法/操作的功能,但似乎没有确定是否授予某些“操作”访问权限的功能控制图形用户界面。例如隐藏/禁用某些菜单等。
我理解错了还是我的方法错了?有没有 JAAS 的替代品?是否存在向 GUI 应用程序添加身份验证和授权的“最佳实践”?
谢谢你的帮助,恩尼
我们正在使用 swing 编写一个带有富 GUI 客户端的三层应用程序,我们需要添加一些身份验证和授权控制。我对这个主题完全陌生,所以我在网上做了一些研究。我的第一个意图是将 JAAS 用于此功能,但据我所知,JAAS 仅包含执行特权方法/操作的功能,但似乎没有确定是否授予某些“操作”访问权限的功能控制图形用户界面。例如隐藏/禁用某些菜单等。
我理解错了还是我的方法错了?有没有 JAAS 的替代品?是否存在向 GUI 应用程序添加身份验证和授权的“最佳实践”?
谢谢你的帮助,恩尼
富 GUI 客户端与标准网站没有什么不同。两者都是客户端,并且控制着潜在的攻击者。因此,无论您想到什么安全措施,一个有决心的人都可以打破它。请记住,在 UI 上隐藏/禁用按钮的整个想法是可用性,而不是安全性。
首先,向所有用户显示所有按钮,但请确保如果正常单击管理按钮,服务器不允许它。正确获得服务器端身份验证后,添加 shims 以隐藏/禁用 UI 上的按钮。为此,您可以编写一个返回登录用户拥有的角色/权限的服务。
JAAS 是一种完美的服务器端身份验证技术。您应该能够找到很多文档来保护服务器资源。
您的用户必须登录到 Swing GUI,并且必须经过服务器的身份验证。这是最重要的一步。如果您不使用服务器对用户进行身份验证,那么它根本没有安全性。
此后,每次单击按钮,用户操作都会转到服务器,服务器会验证用户是否具有权限。如果他不这样做,则向客户端抛出异常。这样,如果有人通过某种诡计启用了您的按钮,服务器就会捕捉到它。
虽然@sri 的回答提出了一些好处,但“只传递会话标识符/令牌”的建议是危险的,因为它太容易被欺骗。您需要建立一个由可信来源验证的通用上下文。看看org.ietf.jgss.GSSContext
这方面的细节。
为了让 GSS 上下文正常工作,您将接触到密钥分发中心 (KDC)的概念,这通常会导致 Kerberos 和正常的某种目录服务器 - 抱歉,我有点含糊,但不知道只是你所拥有的很难具体说明,即使那样我也只使用 Active Directory 完成了这项工作。
一旦你完成了所有的认证,你就可以回到保护某些功能的原始点。
身份验证过程将提供一个javax.security.auth.Subject
,其中将包含一个或多个java.security.Principal
s。这些主体可与 JAAS 一起使用,以创建使用此处描述的主体的策略文件。通常,您使用主体来表示用户拥有的角色,这些角色是从目录服务器加载的。过去我专门使用登录模块来执行此操作,尽管可能有更好的方法。
这已经锁定了一切,所以最后一步是让它对用户来说看起来很漂亮,据我所知,你是靠自己的。您可以简单地启用所有功能,并在无法执行操作时警告用户,或者当您让主题根据组成员身份执行更复杂的操作时。
使用 JAAS
JAAS 是一个通用框架,不会提供任何特定于应用程序的功能,例如禁用/启用按钮等。您必须将该授权逻辑嵌入到您的应用程序中,JAAS 为您提供了一个经过身份验证/授权的 Principal 对象的句柄,在这种情况下很方便情景。