Estoy tratando de modelar mi base de datos Parse para el acceso a ACL con Roles. Los roles contendrán muchos usuarios para que los usuarios puedan tener grupos con los que compartir datos. También estoy bloqueando todos los CLP al 100 %. Solo el usuario tendrá acceso público a buscar () y escribir () para iniciar sesión y crear.
Todavía no he visto una situación exacta en la que esto se haya explicado en absoluto. He visto muchos ejemplos de relaciones, punteros y acceso a roles de ACL, pero ninguno para bases de datos compartidas y seguras. Hasta ahora, no puedo entender ni extrapolar cómo puedo tener CLP bloqueados (sin buscar ()) y acceso a ACL basado en roles. ¿Pueden los punteros o las relaciones habilitar esto de alguna manera?
Los colores de obtención actuales devuelven todos los objetos con clave maestra (obviamente, lo contrario de lo que quiero) o acceso denegado.
Parse.Cloud.define("ccGetColors", async (request) => { let currentUser = request.user; let query = new Parse.Query("Color"); // query.equalTo("user", currentUser); let results = await query.find({ useMasterKey: true }); if(results.length === 0) throw new Error('No results found!'); let steralizedResults = []; for (let i = 0; i < results.length; i++) { let object = results[i]; let color = object.get("color"); steralizedResults.push(color); } return steralizedResults; });Agregar usuario a roles
Parse.Cloud.define("ccAddUserToRole", async function(request) { let user = request.user; // Get group admin ID let userQuery = new Parse.Query("AddUser"); let results = await userQuery.find({ useMasterKey: true }); let resultObject = results[0]; let groupAdminObject = resultObject.get("groupAdmin"); let groupAdminID = groupAdminObject.id; // Concatonate group name let groupName = "Group_" + groupAdminID; // Query for group role with group ID let roleQuery = new Parse.Query(Parse.Role); roleQuery.contains("name", groupName); roleQuery.first({ useMasterKey: true }).then(function(role) { console.log(role); role.relation("users").add(user); role.save(null, { useMasterKey: true }); }); });¿Puede alguien ayudarme a señalarme en la dirección correcta? O apuntar o relacionarme en la dirección correcta;)
En la forma en que funciona la seguridad de Parse Server, para que un determinado usuario tenga acceso a un determinado objeto, deben pasar AMBOS, la regla de regla ACL para el objeto Y la regla CLP para la clase del objeto. Significa que, si elimina todos los permisos en CLP de una determinada clase, solo se podrá acceder a todos los objetos de esa clase a través de Master Key, que se parece al comportamiento que tiene.
Dado que tiene reglas de ACL para cada uno de los objetos, configuraría el CLP para permitir solo usuarios autenticados, y debería lograr lo que necesita de esta manera.
Conseguí que esto sucediera exactamente como pretendía, aunque de una manera un poco indirecta sin usar directamente relaciones o punteros. Estoy seguro de que hay una manera aún más fácil de hacer esto, sin embargo, no lo sé.
En mi proyecto de demostración simple, tengo una clase de color que representa datos simples, la clase incluye un color y un propietario de grupo. La propiedad del propietario del grupo es el nombre del rol que se guarda con cada objeto nuevo. En la consulta de todos los colores, verifico el rol del usuario y hago referencia a esto con los colores a los que el usuario tiene acceso. De esta forma, solo se devuelven los objetos autorizados en función del rol del usuario.
En mi proyecto, todos los CLP están bloqueados al 100%, excepto el inicio de sesión y el registro, e incluso estos estoy buscando bloquearlos para llamar a través del código de la nube. Quiero tanto control del servidor como sea posible y tanto código oculto como sea posible.
Si alguien tiene una entrada o una mejor manera, por favor comparta :)
Parse.Cloud.define("ccSaveColor", async (request) => { let colorString = request.params.color; const query = await new Parse.Query(Parse.Role).equalTo('users', request.user).find({ useMasterKey: true }) let role = await query[0]; var groupACL = new Parse.ACL(); groupACL.setRoleWriteAccess(role, true); groupACL.setRoleReadAccess(role, true); let Color = Parse.Object.extend("Color"); let color = new Color(); color.set("groupOwner", role.get("name")); color.set("color", colorString); color.setACL(groupACL); return await color.save(null, { useMasterKey: true }); }); Parse.Cloud.define("ccGetColors", async (request) => { const roleQuery = await new Parse.Query(Parse.Role).equalTo('users', request.user).find({ useMasterKey: true }) let role = await roleQuery[0]; let query = new Parse.Query("Color"); query.equalTo("groupOwner", role.get("name")); let results = await query.find({ useMasterKey: true }); if(results.length === 0) throw new Error('No results found!'); let steralizedResults = []; for (let i = 0; i < results.length; i++) { let object = results[i]; let color = object.get("color"); steralizedResults.push(color); } return steralizedResults; });