如何在 Firebase 中实现基于角色的访问控制

     2023-02-22     270

关键词:

【中文标题】如何在 Firebase 中实现基于角色的访问控制【英文标题】:how do I implement role based access control in firebase 【发布时间】:2013-10-31 11:39:04 【问题描述】:

这是我第一次涉足 Firebase 和 nosql,我来自 SQL 背景。

使用简单登录安全电子邮件/密码,如何限制对 Firebase 中数据的访问?例如,一些用户将有权创建业务对象(用户、客户、类别等),而其他用户则不能。有没有办法将权限列表附加到“auth”变量?

【问题讨论】:

【参考方案1】:

没有办法将权限直接附加到 auth 变量(或者至少这似乎不是预期的策略)。我建议创建一个由auth.uid 组织的用户集合,您可以在其中保留任何类型的权限属性,这样您的安全规则可能看起来像这样(未经测试):


  "rules": 
    ".read": true,
    "users": 
      ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'"
    
  

其中role 是属于您的users 集合中所有对象的属性。

更新

请看下面的评论:

“无法将权限直接附加到 auth 变量”这在 2017 年发生了变化。您现在可以将自定义声明附加到安全规则中提供的身份验证配置文件。有关自定义声明,请参阅 bojeil 的答案和 Firebase 文档。 ——弗兰克·范·普菲伦

【讨论】:

感谢您的回复。我很清楚,您建议我向每个用户记录添加一个布尔值,以指示他们是否有权访问他们正在访问的资源。那是对的吗?我是否需要为每种类型的业务对象(用户、客户、类别等)创建类似的规则? 在不了解您的应用要求的情况下,很难知道您究竟需要什么,我只是想传达您如何在 Firebase 中管理这种类型的“权限”的一般策略。根据您构建实际数据的方式,您可能需要也可能不需要多次使用该规则。你可能需要也可能不需要每个用户的布尔值,也许他们只有一个用户type 字符串,比如"admin",你就可以匹配。也许只有“管理员”需要该属性,因为没有它,默认情况下特权将失败。明白我的意思了吗? 很好的解释! @hiattp 这太完美了!正是我想要的。对我帮助很大 “无法将权限直接附加到 auth 变量” 这在 2017 年发生了变化。您现在可以将自定义声明附加到安全规则中提供的身份验证配置文件。请参阅bojeil's answer 和Firebase documentation for custom claims。【参考方案2】:

Firebase 通过对 ID 令牌的自定义用户声明启动了对任何用户基于角色的访问的支持:https://firebase.google.com/docs/auth/admin/custom-claims

您将定义管理员访问规则:


  "rules": 
    "adminContent": 
      ".read": "auth.token.admin === true",
      ".write": "auth.token.admin === true",
    
  

使用 Firebase Admin SDK 设置用户角色:

// Set admin privilege on the user corresponding to uid.
admin.auth().setCustomUserClaims(uid, admin: true).then(() => 
  // The new custom claims will propagate to the user's ID token the
  // next time a new one is issued.
);

这将传播到相应用户的 ID 令牌声明。 您可以在之后立即强制刷新令牌:user.getIdToken(true)

要从客户端上的令牌中解析它,您需要对 ID 令牌的有效负载进行 base64 解码:https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client

您可以根据需要升级/降级用户。如果您有重复的脚本来更改用户的访问级别,他们还提供了一种列出所有用户的编程方式:https://firebase.google.com/docs/auth/admin/manage-users#list_all_users

【讨论】:

【参考方案3】:

一年后再次查看“自定义令牌”可能是更好的选择。

https://www.firebase.com/docs/security/guide/user-security.html#section-custom

【讨论】:

这种方法很漂亮。感谢提及! 我可以使用自定义令牌并声称知道客户端(Web)上的用户角色吗?

如何在 WPF 应用程序中实现基于角色的菜单访问列表

】如何在WPF应用程序中实现基于角色的菜单访问列表【英文标题】:HowtoImplementRolebasedMenuAccessListinWPFapplication【发布时间】:2014-05-2208:07:31【问题描述】:我正处于设计基于角色的访问列表的阶段,其中角色将分配给组而不是个... 查看详情

如何在 Firebase 中创建基于角色的访问控制或自定义声明

】如何在Firebase中创建基于角色的访问控制或自定义声明【英文标题】:Howtocreaterole-basedaccesscontrolorcustomclaimsinfirebase【发布时间】:2018-09-2721:06:41【问题描述】:我正在使用firebase-auth和firebase-ui-auth构建一个Android应用,用于Firest... 查看详情

如何在 Spring Boot 中实现基于角色权限的系统

】如何在SpringBoot中实现基于角色权限的系统【英文标题】:HowtoimplementRolePermissionbasedsysteminSpringBoot【发布时间】:2016-11-0919:14:30【问题描述】:我正在尝试使用springboot和springsecurity来实现基于角色权限的系统。为此,我以http://w... 查看详情

如何在 React 中实现基于多角色的授权

】如何在React中实现基于多角色的授权【英文标题】:HowtoimplementmultirolebasedauthorizationinReact【发布时间】:2020-06-2101:17:44【问题描述】:我正在开发具有不同多角色(管理员、用户、经理)的应用程序,我想保护管理员的路线不... 查看详情

如何在微服务架构中实现基于角色的安全性

】如何在微服务架构中实现基于角色的安全性【英文标题】:howtoimplementrole-basedsecurityinmicroservicesarchitecture[closed]【发布时间】:2020-05-0406:45:32【问题描述】:我有一个带有4个微服务、eureka服务器和一个集中式API网关的spring-boot... 查看详情

授权服务如何在基于角色的微服务架构中实现所有权检查

】授权服务如何在基于角色的微服务架构中实现所有权检查【英文标题】:Howanauthorizationserviceimplementsownershipchecksinarole-basedmicroservicearchitecture【发布时间】:2018-03-0907:15:11【问题描述】:假设我在博客应用上有三种类型的用户作... 查看详情

如何在 Azure AD B2C 中实现基于成员的访问?

】如何在AzureADB2C中实现基于成员的访问?【英文标题】:HowtoimplementmembershipbasedaccessinAzureADB2C?【发布时间】:2019-08-2910:09:20【问题描述】:我有一个AzureADB2C租户,并且我已经在多个应用程序中实现了登录/注册流程,并且所有这... 查看详情

如何在 MVC 控制器中实现数据访问层

】如何在MVC控制器中实现数据访问层【英文标题】:HowtoimplementadataaccesslayerwithinMVCController【发布时间】:2017-10-1914:30:48【问题描述】:我了解数据访问层或简称DAL用于访问和检索数据库中的信息,但我不确定如何在控制器中调... 查看详情

如何在 MVVM-C RxSwift 中实现 firebase 身份验证

】如何在MVVM-CRxSwift中实现firebase身份验证【英文标题】:HowtoimplementfirebaseauthintoMVVM-CRxSwift【发布时间】:2020-03-2512:27:07【问题描述】:我正在尝试实现一个MVVM-Crxswift应用程序。我的注册视图控制器有一个虚拟机,用户名和密码... 查看详情

如何使用 Postgraphile 或替代方案在 Postgres 中实现复杂的基于权限的数据访问

】如何使用Postgraphile或替代方案在Postgres中实现复杂的基于权限的数据访问【英文标题】:HowtoimplementcomplexpermissionbaseddataaccessinPostgreswithPostgraphileoralternatives【发布时间】:2021-02-0304:15:02【问题描述】:对于一个新项目,我们目... 查看详情

如何在 Spring-Data-Rest 中实现细粒度的访问控制?

】如何在Spring-Data-Rest中实现细粒度的访问控制?【英文标题】:HowdoIimplementfine-grainedaccesscontrolinSpring-Data-Rest?【发布时间】:2014-12-2521:44:51【问题描述】:TL;DR:如何在Spring-Data-Rest提供的扁平化RESTapi方法中实现细粒度的访问控... 查看详情

如何在我的 Web MVC 应用程序中实现访问控制列表?

】如何在我的WebMVC应用程序中实现访问控制列表?【英文标题】:HowcanIimplementanAccessControlListinmyWebMVCapplication?【发布时间】:2011-03-2616:52:11【问题描述】:第一个问题请您解释一下如何在MVC中实现最简单的ACL。这是在Controller中... 查看详情

Java/MySql如何实现基于角色的访问控制?

】Java/MySql如何实现基于角色的访问控制?【英文标题】:Howtoimplementrole-basedaccesscontrolJava/MySql?【发布时间】:2012-12-0610:26:55【问题描述】:我打算开始一个基于Web的项目,该项目涉及用户注册,就像论坛/CMS一样,但我的障碍是... 查看详情

如何使用firebase基于角色级别存储数据并做出反应

我目前正在使用react和firebase进行最后一年的项目,我一直在使用firebase并且能够直接存储数据,但现在我想给用户提供基于角色的访问权限。这是用户的*hierarchy*,用于存储收到的所有数据和最高级别的用户即主体可以读写所有... 查看详情

如何在视图模型中实现 Firebase 电话身份验证?

】如何在视图模型中实现Firebase电话身份验证?【英文标题】:Howcanfirebasephoneauthbeimplementedinviewmodel?【发布时间】:2021-04-1004:42:00【问题描述】:我正在尝试使用Kotlin在视图模型中添加Firebase电话身份验证代码。问题是PhoneAuthProvi... 查看详情

权限控制

...经理、总经理。。(角色针对用户来划分) 系统代码中实现://如果该user是部门经理则可以访问if中的代码if(user.hasRole(‘部门经理‘)){         查看详情

如何设计基于分层角色的访问控制系统

】如何设计基于分层角色的访问控制系统【英文标题】:Howtodesignahierarchicalrolebasedaccesscontrolsystem【发布时间】:2013-04-1422:02:19【问题描述】:基本交易是,我们为我们的项目定制了一个“kickstart”。为此,我们正在考虑重做用... 查看详情

如何在 Qt 中实现基于 GStreamer 的视频小部件?

】如何在Qt中实现基于GStreamer的视频小部件?【英文标题】:HowtoimplementavideowidgetinQtthatbuildsuponGStreamer?【发布时间】:2010-12-2419:01:24【问题描述】:我想使用Qt创建一个可以播放本地视频文件的简单GUI应用程序。我可以使用Phonon... 查看详情