Flutter 基于角色的授权和基于角色的访问控制

Flutter 基于角色的授权和基于角色的访问控制,flutter,google-cloud-firestore,firebase-authentication,Flutter,Google Cloud Firestore,Firebase Authentication,我试图做的是设置一个基于角色的授权请求用户和订阅用户,并根据角色将用户重定向到不同的屏幕。 我被卡住了。我尝试了不同的解决方案,并且看到了每个关于这个概念的教程。我理解这个概念是如何工作的,但在我的代码中设置它确实很困难。我不知道在哪里声明订阅的用户,如何创建函数以及如何导航他们! 非常感谢您的帮助! 这就是我的代码的外观 //这是我的身份验证服务 static void signUpUser( BuildContext context, String name, String email

我试图做的是设置一个基于角色的授权请求用户和订阅用户,并根据角色将用户重定向到不同的屏幕。 我被卡住了。我尝试了不同的解决方案,并且看到了每个关于这个概念的教程。我理解这个概念是如何工作的,但在我的代码中设置它确实很困难。我不知道在哪里声明订阅的用户,如何创建函数以及如何导航他们! 非常感谢您的帮助! 这就是我的代码的外观

//这是我的身份验证服务

 static void signUpUser(
  BuildContext context, String name, String email, String password) async {
try {
  AuthResult authResult = await _auth.createUserWithEmailAndPassword(
      email: email,
      password: password
  );
  FirebaseUser signedInUser = authResult.user;
  if (signedInUser != null) {
    _firestore.collection('/users').document(signedInUser.uid).setData({
      'name': name,
      'email': email,
      'profileImageUrl': '',
    });
//注册页面

    final _formKey = GlobalKey<FormState>();
  String _name, _email, _password;

  _submit() {
    if(_formKey.currentState.validate()){
      _formKey.currentState.save();

      AuthService.signUpUser(context, _name, _email, _password);
    }
  }

存储角色信息最常见的两个位置是:

作为该用户的Firebase身份验证令牌中的, 在与该用户关联的文档中的数据库中。 无论您选择哪一个,您都应该在一个可信的环境中设置此角色—您的开发机器、您控制的服务器或云功能,否则任何人都可以更改自己的角色

在这些位置中设置后,您可以访问客户端代码中的角色信息,并导航到该用户的正确屏幕

另见:

这是一段视频 @错误位置有一个示例颤振架构可用于此问题

以下是相同的链接:


我已经尝试和测试了好几次,它就像一个符咒。此外,当用户角色发生变化时,用户无法访问以前用户的信息,这有助于数据保护和隐私问题。

我了解这个概念的工作原理,但在代码中设置它确实很困难。因为您的代码没有显示任何关于用户角色的信息,所以很难提供帮助。您询问的具体代码是什么?如果不行,我建议你去看看hej frank。谢谢你的回复!我用我的用户模型更新了这个问题。老实说,我不太确定如何定义用户角色开始。在这种情况下,视频将是一个很好的开始。存储角色信息最常见的两个位置是:1作为该用户的Firebase身份验证令牌中的自定义声明,2在与该用户关联的文档中的数据库中。无论您选择哪一个,都应该在您的开发机器、您控制的服务器或云功能的受信任环境中设置此角色,否则任何人都可以更改自己的角色。是否尝试过:?
 Widget _getScreenId() {
    return StreamBuilder<FirebaseUser>(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, snapshot) {
        if (!snapshot.hasData) {
          Provider.of<UserData>(context).currentUserId = snapshot.data.uid;
          return LoginScreen();
        } else {
          return HomeScreen();
        }
      },
    );
  }
class User {
  final String id;
  final String name;
  final String profileImageUrl;
  final String email;
  final String bio;

  User({
    this.id,
    this.name,
    this.profileImageUrl,
    this.email,
    this.bio
  });