Ios 根据角色Firebase和Swift 3显示不同的视图控制器

Ios 根据角色Firebase和Swift 3显示不同的视图控制器,ios,swift,firebase,Ios,Swift,Firebase,我正在构建一个非常简单的应用程序,它可以将报告从用户发送到管理员。到目前为止,我已经完成了整个前端。我的菜单在工作,报告的顺序是看不见的。现在是时候让我来处理后端了。我是一个新的Swift开发人员,完全自学(就像你应该是:)并且我在一些事情上被难住了。我只是需要一些指导,我已经使用堆栈溢出在后面的建议,只是阅读,但从来没有问过一个问题。所以我要问你们,神圣的堆栈社区,是!: 我有两个用户角色 普通用户 管理员 我希望能够根据他们在firebase中的角色,在他们登录时将他们重定向到各自的视图控制

我正在构建一个非常简单的应用程序,它可以将报告从用户发送到管理员。到目前为止,我已经完成了整个前端。我的菜单在工作,报告的顺序是看不见的。现在是时候让我来处理后端了。我是一个新的Swift开发人员,完全自学(就像你应该是:)并且我在一些事情上被难住了。我只是需要一些指导,我已经使用堆栈溢出在后面的建议,只是阅读,但从来没有问过一个问题。所以我要问你们,神圣的堆栈社区,是!:

我有两个用户角色

  • 普通用户
  • 管理员
  • 我希望能够根据他们在firebase中的角色,在他们登录时将他们重定向到各自的视图控制器。现在!我问了我的一个朋友,他告诉我他们都可以在同一个应用程序中完成,我不需要为管理员制作不同的应用程序。我猜这是真的,因为我相信他的判断。我在考虑做if检查

    //如果角色是=管理员
    self.performsgue(管理VC)
    //否则
    
    self.performsgue(主屏幕)
    很难给出准确的答案,因为你的问题相当广泛,但沿着这些思路应该可以完成你的目标。只需确保切换出具有正确信息的占位符:

    //Fetch user role from Firebase DB
    FIRDatabase.database().reference().child("PATH_TO_YOUR_USER_OBJECT").observeSingleEvent(of: .value, with: { (snapshot) in
    
        //Obtain value of user role
        let snapValue = snapshot.value as! [String:AnyObject]
        let userRole = snapValue["KEY_OF_USER_ROLE"] as! String
    
        //Set default vc in case of error
         var viewControllerID = "DEFAULT_VC_ID"
    
        //Set vc based on user role
        if userRole == "admin" {
            viewControllerID = "ADMIN_VC_ID"
        } else {
            viewControllerID = "USER_VC_ID"
        }
    
        //Instantiate correct vc and make it the root vc
        self.storyboard = UIStoryboard(name: "YOUR_STORYBOARD_NAME", bundle: Bundle.main)
        self.window?.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: viewControllerID)
    })
    

    这将是一个两步的过程

    第一步是验证用户并检索其用户uid

    Auth.auth().signIn(withEmail: "dude@thing.com", password: "password", 
      completion: { (auth, error) in
    
        if error != nil {
            let err = error?.localizedDescription
            print(err!)
        } else {
            print("succesfully authd")
            let uid = auth!.uid
    
            assignUserRole(uid)     
        }
    })
    
    假设您有一个包含其他用户数据的标准用户节点

    users
      uid_0
       fav_food: "pizza"
       user_role: "admin"
      uid_1
       fav_food: "tacos"
       user_role: "normal_user"
    
    步骤2:然后调用assignUserRole函数以获取用户信息并设置UI

    function assignUserRole(theUid: String) {
    
       let thisUserRef = appRef.child("users").child(theUid)
       thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
           let userDict = snapshot.value as! [String: Any]
           let favFood = userDict["fav_food"] as! String
           let userRole = userDict["user_role"] as! String
           print("  \(favFood)  \(userRole")
    
          if userRole == "admin" {
            //display admin viewController
          } else {
            //display normal user viewController
         }
       })
    }
    

    好的,你可以在这里阅读所有关于它的内容:当你有一个具体的问题,你可以再问一遍,因为你的问题是对布罗德诺。你不能像那样从Firebase“获取”数据。reference.value不包含任何自定义用户数据的路径,而且它也不符合key:value编码。干得好!但是我想知道您是否可以告诉我您的方法和定制声明(JWT)在以下情况下的区别:this@akaak我不明白你的问题。什么是自定义索赔(JWTs)?很乐意提供帮助。我只需要知道在什么情况下,我才能进行比较。这是您注册时除了电子邮件和密码之外还可以存储的其他信息。在自定义声明中向每个用户存储{admin:true}或{admin:false}可能是解决此问题的另一种方法。@akaak这是管理SDK的文档,与Firebase实时数据库SDK和身份验证API不同。admin SDK是Java/Web(不是swift)的,面向那些希望在其应用程序之外拥有更好控制级别的开发人员,或者希望集成外部用户系统或利用您自己的服务器的开发人员。@akaak有趣的阅读!很高兴知道我们可以使用Swift。回到你最初的问题,文章说也许你想添加一个家庭地址,额外的照片URL,或者一个个人资料描述,例如。但这不是定制索赔的目的。像地址这样的数据应该存储在数据库中,因为它与身份验证无关。。因此,看起来您可以存储这种类型的数据,但他们建议不要这样做。我不确定在这种情况下,管理员用户和标准用户之间的区别会存储在哪里。我要多读一点。