我正在开发一个应用程序,使用 Next.js 作为前端,使用 ASP.NET Core 作为后端。该应用程序具有大型菜单结构,我需要实现基于角色的访问控制,以便不同的用户根据其权限看到不同的菜单项。
我正在尝试从性能和可维护性的角度来决定管理此菜单数据的最佳方法:
将菜单结构存储在前端(硬编码数据),这可能会简化前端代码,但随着菜单的增长和用户权限需要更新可能会变得具有挑战性。
将菜单存储在数据库中,这可以为更改和权限提供更大的灵活性,并可轻松更新不同用户角色。但这可能会增加复杂性,而且我担心每次用户登录时查询数据库以获取菜单数据会对性能产生影响。
以下是我的主要考虑:
随着需求的变化,菜单结构更新的便捷性。从数据库获取菜单结构对性能的影响。根据角色管理用户权限的便捷性。在这种情况下,最佳做法是什么?我应该将菜单数据存储在数据库中,还是将其硬编码在前端以实现最佳的可管理性和可扩展性?
任何建议或指导都将不胜感激。谢谢!
我的想法是,我们可以将菜单绑定到角色并将菜单存储在数据库中,因为我从事的门户项目也采用了此解决方案。一些菜单在前端是硬编码的,例如主页、仪表板,即使没有帐户登录,这些菜单也可供所有用户使用,因此我们可以动态地将菜单添加到导航栏中以供不同的用户使用。
在我看来,无论我们选择使用哪种方式,数据库都需要存储用户、角色、菜单、用户角色和角色菜单。然后应用程序可以根据不同用户的角色动态显示不同的菜单。这两种方法(前端应用程序中的硬编码菜单或动态添加菜单)之间的最大区别在于我们是否希望前端应用程序执行“隐藏”操作或“添加菜单”操作。“添加”操作只需要有一个 foreach 循环来生成菜单树并将其添加到菜单导航栏中,但“隐藏”操作需要控制所有菜单的“IsHidden”属性,这会给长期管理带来很多麻烦。
假设有一天我们需要添加/更新菜单及其与角色的关系,如果我们动态添加菜单,我们只需要更改存储在数据库中的数据,无需更改前端。但如果我们在前端进行硬编码,我们需要更改数据库,然后也更改前端的“IsHidden”逻辑。
两种方式都需要用户登录时发起登录请求,响应中应包含用户信息和菜单信息。硬编码菜单需要菜单的布尔结果列表,而添加菜单需要包含用于创建的菜单 url
<a href="url">menu name</a>
和父子菜单关系(如果要同时显示子菜单)。响应中的数据越多意味着数据传输的成本越高,从数据库查询的时间也越多,但这不会严重降低性能。