java - 在 Vaadin Flow 中处理登录和授权的最佳方法?

标签 java mysql authentication web vaadin

我正在使用 Vaadin Flow 通过 Java 开发 Web 应用程序。我想知道处理登录和授权的最佳方法。我一直在考虑这个问题,但不确定最好的方法。

我有一个登录 View 和一个主应用程序 View ,其中包含用于嵌套布局的内容容器。

如何检查用户是否已登录以及其拥有哪些权限才能查看或看不到应用程序的某些部分?我读过有关 BeforeEnterEvent 和 ReRouting 的内容,但仍然不是很清楚。

  • 我必须为我的每个类(class)使用 BeforeEnterEvent 吗?我是否必须创建一个带有用户参数(例如 boolean 值)的类来检查它是否已登录,并创建一个字符串来表示它所拥有的授权类型?我在哪里创建或保存这个实例?

  • 有没有简单的方法可以做到这一点?喜欢从空布局开始并从登录屏幕开始,然后登录屏幕决定交换主应用程序 View ?如何防止用户在栏中输入主视图的地址并访问不应访问的部分,例如:/app/adminsettings

我确信这要简单得多,但我想我现在已经重载了,提前感谢任何人!

最佳答案

一如既往,没有 Elixir 。 “最好的方法”总是取决于 要求和您的选项范围从基本身份验证到一些外部身份验证 OIDC 提供商。

已经有一些教程,其中最著名的来自 Vaadin 本身关于 Spring Security (在之前的迭代中存在一个损害安全性的缺陷, 这当然再次表明,安全不是产品而是过程 并要求不断验证)。

所以我想针对您所面临的问题制定更多策略 面临的问题和需要考虑的一些事情:

  • 请注意,当您使用安全库时,它具有或允许 以网络路径为中心的方法,您应该仅将其用于 root 并打开资源路径等。历史记录 API 可能只 看起来您正在从服务器或 Web 套接字获取 URL 在幕后使用,突然间这些规则不再适用。

  • 如果您使用基于注释的方式来添加路线,您最终会 以及每个用户 UI 的所有路由。所以就是 很高兴熟悉如何register routes dynamically 。 例如。只添加用户登录时允许的路由;这通常 也对 UI 产生影响(例如菜单条目)。

  • 通常有一些初始的“声明性”安全部分(可以 用户甚至进入该 View ;这通常意味着一些简单的角色检查)。 检查这一点的一个好地方是将 BeforeEnterListener 添加到 用户界面;它将在导航到任何 View 之前被调用。看 navigation livecyle

  • 下一个要保护的入口点是您可以使用的 BeforeEnterEvent 在 View 本身中监听和/或者它可能实现 HasUrlParameter。如果您从“请求”或路径中获取参数, 通常意味着进一步检查(例如,是否允许代理用户 编辑 ID 为 42 的博客条目)。请参阅routing and URL parameters 还有navigation livecyle .

  • 深入到应用程序中,您最终会得到一些更迫切的东西, 库通常看起来是声明性的,因为它们生成 从一些注释中为您提供一些代码(例如,一些生成的 AOP @SecurityCheck('${u.owner}==${currentUser}') 周围的代码 void save(User u) 方法,用于检查角色以及是否 用户 u 属于代理用户)。

    非常确定,您的 IoC 系统/库/...能够看到这些 注释并生成相应的代码。仅@Route 例如 将获得 Vaadin+Spring 的完整 DI 处理 - 其余的就是 你的工作是 DI 框架可以完成它的工作(来自错过的 NPE) @Autowired 很快就被发现了,但没有进行安全检查 称为,不是)。解决这个问题的明显方法是势在必行, 自己编写代码,而不是依赖它。

  • 如果您有匿名系统并且需要登录,请确保发送 用户切换到新的 session (以及 UI);不仅如此 防止 session 固定攻击,但它也允许您将所有 根据安全性在一个地方进行路由设置和 UI 派生 UI 创建的开始。如果你有想要携带的状态 结束后,将其作为 URL 的一部分,表示您的成功登录过程 将它们发送回或停放在浏览器本地存储中。

关于java - 在 Vaadin Flow 中处理登录和授权的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806498/

相关文章:

mysql - ERROR 1005 MySQL Workbench 正向工程

wcf - IIS 6.0 上 WCF 中的集成 Windows 身份验证

java - OrientDB 有类似 @MappedSuperclass 的东西吗?

java - 谷歌应用引擎的波什托管

java - 如何从 SeaGlass L&F 中的 JTextArea 中删除行分隔符?

java - 在 Android 中检查密码

WCF 客户端无法验证 Java Web 服务。找不到 X509SecurityToken 的 token 验证器

Java - 创建 Github v3 公钥

javascript - 如何按已付费和未付费值对数据进行分组

php - Opencart在类别页面显示产品类别