2012-10-06 43 views
12

El primer inserto funciona bien, pero el segundo da "Insert Failed: 403 - Access denied" en la consola. La suscripción automática está habilitada y estoy en la rama de autenticación. ¿Cómo configuro mi código para que tenga un servidor MongoDB en el que los clientes puedan escribir?Meteor Mongo Insert Failed - Acceso denegado

People = new Meteor.Collection('people'); 

if (Meteor.is_server) { 
People.insert({name: 'Bob'}); 
} 
if (Meteor.is_client) { 
People.insert({name: 'Bob'}); 
} 
+0

¿Estás en la rama de autenticación? –

+0

Sí, estoy en la rama de autenticación. – Alex

+0

Ok, así que supongo que es porque no tengo validador de inserción ... – Alex

Respuesta

18

Debido a que se está trabajando con autenticación, debe permitir o denegar clientes tratando de hacer inserciones, actualizaciones, quita y recuperaciones. Para solucionar este problema específico, debe agregar Collection.allow() para que funcione la inserción del cliente.

if(Meteor.is_server) { 

    People.allow({ 
    'insert': function (userId,doc) { 
     /* user and doc checks , 
     return true to allow insert */ 
     return true; 
    } 
    }); 

} 
+5

Como nota al margen para el lector inexperto: el fragmento de código en esta respuesta puede no ser seguro para su caso. Este fragmento permite a cualquier cliente actualizar la colección relacionada (es decir, Personas). Si está utilizando la nueva API de Cuentas de Meteor (http://docs.meteor.com/#accounts_api), debe devolver una comprobación al usuario registrado (por ejemplo, return userId && doc.owner === userId, donde propietario es un atributo recuperado de tu colección). Consulte la sección Ejemplo en http://docs.meteor.com/#allow – dgraziotin

+0

. Tuve que colocarlo fuera del espacio de nombres is_server para que esto funcione. – radtek

8

Método de uso allow() en la Colección Personas. Este método asigna acceso CRUD.

function adminUser(userId) { 
    var adminUser = Meteor.users.findOne({username:"admin"}); 
    return (userId && adminUser && userId === adminUser._id); 
} 
Lugares.allow({ 
    insert: function(userId, lugar){ 
    return adminUser(userId); 
    }, 
    update: function(userId, lugares, fields, modifier){ 
    return adminUser(userId); 
    }, 
    remove: function (userId, docs){ 
    return adminUser(userId); 
    } 
}); 
+1

¿Por qué 'Lugares'? Tal vez debería ser 'Gente'? – Artemix

+1

Esta respuesta no está realmente relacionada con la pregunta ¿verdad? –

+0

¿Por qué esto se revocó? Muestra las tres funciones de permiso para las que necesita agregar controladores. Además, este código debe ejecutarse en el cliente Y en el servidor, por lo que es más apropiado. (En el lado del cliente se calculan previamente los resultados de llamar a esto y se salta un servidor de ida y vuelta. – MrMowgli

3

que he encontrado este error después quité insegura paquete de mi proyecto.

meteor remove insecure 

siguiente solucionó mi problema.

Posts = new Meteor.Collection('posts'); 

Posts.allow({ 
    insert: function(userId, doc) { 
    // only allow posting if you are logged in 
    return !! userId; 
    } 
}); 
+0

configurando Meteor.methods y luego llamándolos al cliente por Meteor.call ('methodname', params), arreglará esto también referencia: https://www.meteor.com/tutorials/blaze/security-with-methods – rdk1992

2

Si sólo ha probando proyecto como simple tutorial-todos, se puede resolver con la adición del paquete insegura

meteor add insecure 
Cuestiones relacionadas