En Rails, generalmente se usaría una biblioteca preexistente. La autenticación es fácil de hacer mal, y el problema se ha resuelto tantas veces que rara vez vale la pena el esfuerzo para resolverlo de nuevo. Si está interesado en escribir su propia implementación, describiré cómo funciona la autenticación moderna.
El método ingenuo de autenticar a un usuario es almacenar su contraseña en una base de datos y compararla con la contraseña que el usuario envía. Esto es simple pero increíblemente inseguro. Cualquiera que pueda leer su base de datos puede ver la contraseña de cualquier persona. Incluso si pone controles de acceso a la base de datos, usted (y sus usuarios) son vulnerables a cualquiera que los piratee.
La forma correcta es utilizar una función hash criptográfica para procesar la contraseña cuando se elige y luego cada vez que se envía. Una buena función de hash es prácticamente irreversible: no puede tomar un hash y convertirlo en una contraseña. Entonces, cuando el usuario inicia sesión, toma la contraseña enviada, la modifica y la compara con el hash en la base de datos. De esta forma, nunca almacena la contraseña en sí. En el lado negativo, si el usuario olvida su contraseña, debe restablecerla en lugar de enviársela.
Incluso esto, sin embargo, es vulnerable a ciertos ataques. Si un atacante se apodera de los hashes de su contraseña y sabe cómo hash sus contraseñas, entonces puede hacer un ataque de diccionario: simplemente toma cada palabra en el diccionario y la mezcla con la original. Esta estructura de datos se llama tabla de arco iris. Luego, si alguno de los hashes de la palabra del diccionario coincide con un hash de contraseña, el atacante puede concluir que la contraseña es la palabra del diccionario que contiene esa contraseña. En resumen, un atacante que puede leer su base de datos aún puede iniciar sesión en cuentas con contraseñas débiles.
La solución es que antes de que se contrate una contraseña, se combina (generalmente concatenada o xor'd) con un valor llamado sal que es exclusivo para cada usuario. Puede generarse aleatoriamente, o puede ser una marca de tiempo de creación de cuenta o algo así. Entonces, un atacante no puede usar una tabla de arcoíris porque cada contraseña es esencialmente hash ligeramente diferente; tendría que crear una tabla de arcoiris separada para cada sal distinta (prácticamente para cada cuenta), lo que sería prohibitivamente costoso desde el punto de vista computacional.
Me haré eco del consejo de los otros que responden: esto no es algo simple, y no necesita hacerlo porque ya se ha hecho antes, y si lo hace usted mismo tiene una muy buena oportunidad de hacer una error e inadvertidamente comprometiendo la seguridad de su sistema. Pero si, por alguna razón, realmente desea escribir uno usted mismo, espero haber proporcionado un bosquejo (incompleto) de cómo se hace.
es posible que desee echar un vistazo a https://github.com/delight-im/PHP-Auth que es tanto independiente del marco y base de datos agnóstica. – caw