我有一款应用程序,是我通过Ffltter创建的。它使用SQLite数据库来允许用户存储用户生成的数据。它还需要使用Firebase进行身份验证,每个用户都必须有一个帐户,才能登录应用程序。
就在今天,我注意到,当我在手机上使用与我使用的主测试帐户不同的测试帐户登录应用程序时,我可以访问使用我的另一个帐户创建的SQLite数据库中的所有内容,这让我有点惊讶。
有没有办法将用户生成的内容限制为特定用户?我的意思是,如果一个用户在设备上登录应用程序并创建一些内容,如果另一个用户使用同一设备上的帐户登录应用程序,他们将看不到这些内容?
为了处理数据库并向其中添加条目,我构建了以下代码,该代码可以完美地工作:
static final DatabaseClientCalculations instance =
DatabaseClientCalculations._init();
static Database? _database;
DatabaseClientCalculations._init();
/// Calling the database
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDB('calculationsDatabaseV6.db');
return _database!;
}
/// Future function to open the database
Future<Database> _initDB(String filePath) async {
final path = await getDatabasesPath();
final dbPath = join(path, filePath);
return await openDatabase(dbPath,
version: 11, onCreate: _create, onUpgrade: _update);
}
要在数据库中创建新条目,我使用以下命令:
Future<CalcResult> create(CalcResult calcResult) async {
final db = await instance.database;
final id = await db.insert(calcResults, calcResult.toJson());
return calcResult.copy(id: id);
}
要读取特定的数据库条目,我使用以下命令:
Future<CalcResult> readNote(int id) async {
final db = await instance.database;
final maps = await db.query(
calcResults,
columns: CalcResultFields.calcValues,
where: '${CalcResultFields.id} = ?',
whereArgs: [id],
);
if (maps.isNotEmpty) {
return CalcResult.fromJson(maps.first);
} else {
throw Exception('ID $id not found');
}
}
要显示ListView中的所有条目,我使用以下命令:
Future<List<CalcResult>> readAllNotes() async {
final db = await instance.database;
final orderBy =
'${CalcResultFields.toDate} DESC, ${CalcResultFields.toTime} DESC';
final result = await db.query(calcResults, orderBy: orderBy);
return result.map((json) => CalcResult.fromJson(json)).toList();
}
正如我所说的,这确实工作得很好,只是似乎任何用户都可以查看任何其他用户的数据。我似乎错误地认为,由于身份验证,用户将不会看到其他任何人的内容。
有没有办法将对数据库条目的访问限制为只允许创建这些条目的人访问?我如何才能将用户生成的内容仅限于该用户?
1条答案
按热度按时间fjaof16o1#
一种方法是在数据库中创建数据项的每个条目,其中一列具有创建它的用户的ID。
然后,在查询函数中,将传递用户id以及搜索条件的重置,以仅获取用户id创建的、因此被允许访问的记录