Conexión A Base De Datos

Que tal amigos saludos.

Les comento, estoy haciendo un proyecto es acerca de base de datos.

Tengo esto en el main.php


'db'=>array(

    connectionString' => 'mysql:host=localhost;dbname=test',

    'emulatePrepare' => true,

    'username' => 'root',

    'password' => '',

    'charset' => 'utf8',

),

Si dejo asi la aplicacion, todos los usuario que esten almacenados en la tabla usuario, tendran acceso y podran realizar todas operaciones permitidas por la aplicación.

Para ello estoy utilizando el modulo cruge,

Lo que necesito es tener control de los usuario a nivel de base de datos, es decir si los usuario existen en la tabla cruge_user, tambien existan en el gestor de base de datos.

que sea como esto


'db'=>array(

    'connectionString' => 'mysql:host=localhost;dbname=test',

    'emulatePrepare' => true,

    'username' => $usuario,

    'password' => $pass,

    'charset' => 'utf8',

),

donde las variables


$usuario

$pass

se obtienen del formulario de login y con estos parámetros se realice la conexión a la base de datos.

El motivo de esto es para poder tener tablas que lleven la auditoria o logs de las operaciones que realizan los usuario.

Si lo dejo como esta por defecto en mis logs el usuario que realiza todas las operaciones seria root y no es eso lo que deseo.

El problema es que cuando inserto variables en esta parte del modulo me muestra un error porque no se pudo conectar a la base de datos y no me muestra ni la pagina de login.

Espero dar a entender lo que necesito.

He buscado como realizar esto pero lamentablemente no he encontrado ejemplo alguno.

Desde ya espero sus respuestas y les agradezco de ante amono la ayuda brindada…

Hola Vinix,

Creo que lo estas entendiendo mal, el código:




'db'=>array(

    connectionString' => 'mysql:host=localhost;dbname=test',

    'emulatePrepare' => true,

    'username' => 'usuario',

    'password' => 'password',

    'charset' => 'utf8',

),



indica el usuario que se valida a la BBDD es decir la aplicacion.

Luego el desarrollador empleará un sistema de autenticación (sea cruge o cualquier otro).

Tú aplicación se conectará a la BBDD mediante el componente db como esta configurado.

Ahora buscarás los permisos de los usuarios en la BBDD porque eres capaz de conectarte a ella mediante la aplicación y determinarás si se puede hacer una acción o no dependiendo de los permisos.

Lo primero que haces es autenticar a un usuario, es decir saber quien es el que esta manejando el programa y le asignas un ID. Con este ID buscas en la BBDD y obtienes lo que puede y no puede hacer.

Pero esto en Yii y en cualquier aplicación web.

Espero ayude algo la explicación, saludos

Gracias por responder rahif.

Eso lo comprendo completamente. Pero el usuario a nivel de base de datos será el mismo para todas las acciones; en este caso ‘root’.

Cuando hago aplicaciones web con php puro, los usuaios para accesar a la base de datos deben existir en el dbms. Pero con Yii accedo con unico usuario ("root" en el ejemplo) a una tabla que almacena los usuarios.

La parte de accesos a la aplicaciónlo administro con cruge que es algo muy util, también quiero la seguidad a nivel de base de datos y eso es lo que no puedo hacer.

Por ejemplo con las tablas orden, y logorden:

a nivel de aplicación esta bien manipulas la tabla orden. Pero a nivel de dbms la tabla logorden se hace por medio de un trigger que almacena por ejemplo:

numero de orden: la orden que se elimino

fecha: fecha de elminación

usuario: usuario que la elimino.

El campo usuario por la naturaleza del evento, me almacenaría "root" en todos los logs.

ejemplo de trigger:




CREATE OR REPLACE TRIGGER trlogorden

BEFOR DELETE ON orden

FOR EACH ROW


BEGIN

 INSERT INTO logorden(ordenid, fecha, usuario)

 VALUES (OLD.ordenid, CURRENT_TIMESTAMP(), USER());

END



Lo que quiero es que si en login ingresan "jose", con ese usuario se inicie la sesion en dbms y no con "root".

Espero ahora si espero poder haber explicado bien el problema.

ok te explico como lo veo yo,

En casi todas las tablas tengo 4 campos FC,FM,UC,UM que son fecha de creacion, fecha modificacion, usuario creacion, usuario modificacion.

Si en la tabla orden introduces un campo como UM y guardas el valor del ID del usuario que ha realizado la ultima modificacion en el trigger para insertar el registro en logorden en lugar de usar USER() usarias el valor de UM de la tabla orden.

Es verdad que es obligado guardar el ID del usuario en muchas tablas porque es muy importante saber quien ha realizado una acción pero todo eso se gestiona a través de la aplicación.

un saludo

Comprendo que todo eso se maneja desde la aplicación, pero y ¿la seguridad de la base de datos?

La seguridad con un usuario para la aplicación es suficientemente buena para la mayor parte de las webs.

Yo no soy experto en seguridad pero si se que a mayor seguridad mas coste en tiempo y más complejidad.

De todas maneras si quieres que cada usuario sea validado por el gestor de BBDD directamente podrías hacerlo,

cargando dinamicamente el componente db.

Quita el componente db del config.main y agrega:




	'language'=>'es',

	'onBeginRequest'=>array('Begin','start'),



Esto buscaría la clase Begin después de inicializar el mínimo de Yii; start es un método estático que pertenece a la clase Begin que sería ejecutado.

en protected/components crea la clase Begin.php




<?php

/**

 * Clase ejecutado al iniciarse la aplicacion, en cada llamada. Todos los metodos aquí deben ser estáticos ya que no se ha inicializado nada, solo el config/main.php

 */

class Begin{

    //metodo que se ejecuta justo despues del config main, aqui podemos modificar algunos datos dinamicamente.

    public static function start(){

        $user='usuario';

        $pass='clave';

        Yii::app()->setComponents(array(

        'db'=>array(

                    'connectionString' => 'mysql:host=localhost;dbname=yii-bt',

                    'username' => $user,

                    'password' => $pass,

                    'charset' => 'utf8',

            )

        ),true);

    }

}



En start pon la lógica que quierás para saber si un usuario se ha identificado en el sistema y obtener el usuario - clave.

Tambien si no se identificado puedes conectarte con un usuario con mínimos privilegios.

Aquí tienes un sistema para conectarte a BBDD con los permisos del usuario y luego se utilizaría otro sistema de permisos (como cruge) para manejar la aplicación.

Lo veo complejo, el tema de permisos es muy delicado y aquí tendrías que gestionar 2, con la salvedad de que al crear un usuario lo debes crear en cruge y en el gestor de BBDD, lo mismo al actualizar password, lo mismo al eliminarlo.

El tema de tareas no asistidas (crons) no sería viable ya que se requiere que el usuario introduzca el nombre y la clave.

Mira bien el sistema que vas a usar y comentas asi aprendemos todos diferentes posibilidades.

Saludos.

Lo solucionaste ?

Creo que lo lógico seria que tengas un usuario con mínimos permisos, y primero veas si el usuario existe, si el usuario existe y esta bien, entonces deberías cerrar esa sesión de mínimos permisos e iniciar la sesión con el usuarios que esta intentando acceder…

Si encontraste otra soluciona, contanos como te fue!

Saludos!

Gracias por la respuesta, por falta de tiempo, no he podido probar.

Pero seguro que lo haré en las próximas semanas.

Gracias por todo.