Ver Mensaje Individual
  #7 (permalink)  
Antiguo 30/01/2012, 23:41
Avatar de emprear
emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: Visualizar archivos (PDF, doc...) pero con autentificación

@naggety
Estuve probando, y si bien el método funciona, veo que se pone un poco inestable con los pdf.
Pero encontré otro método, creo que más funcional.
Lo primero que dejo en claro, es que el usuario tiene que tenr instalado el plugin de AdobeReader, si no siempre va a querer decargar el archivo
Como dijiste que tenés un sistema de loguin, voy a usar sesiones para el ejemplo

Por un lado tenes la página del loguin, que contra la validación de usuario y contraseña va a hacer algo asi
login.php (yo doy por hecho que se logueo y se creo la sesion pdf = logueado)

Código PHP:
Ver original
  1. <?php
  2. $_SESSION['pdf'] = "logueado";
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <title>titulo</title>
  8. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  9. </head>
  10. <body>
  11.     <p>En un link<br />
  12. <a href="pdf/pdf.php?archivo=Sqlite">ver pdf</a>
  13. </p>
  14.  
  15.  
  16.     <p>Cargando en un iframe<br />
  17. <a href="pdf/pdf.php?archivo=Sqlite" target="visor">ver pdf</a>
  18. </p>
  19.  
  20. <iframe name="visor" width="600" height="400" src="about:blank"></iframe>
  21. </body>
  22. </html>

Los links apuntan a un archivo pdf.php que lleva por parametro archivo=xxx, xxx es el nombre del archivo sin la extension (en el ejemplo, Sqlite)

pdf.php

Código PHP:
Ver original
  1. <?php
  2. if(isset($_GET['archivo'])){
  3. $archivo = $_GET['archivo'];
  4. }else{
  5. $archivo = "noexiste";
  6. }
  7.  
  8.  
  9. if(isset($_SESSION['pdf'])){
  10.    
  11. if($_SESSION['pdf'] == "logueado"){
  12. $fichero = "/$archivo.pdf"; // aqui la ruta a la carpeta con todos tus pdf
  13. if (file_exists($fichero)) {
  14.     header('Content-Type: application/pdf');
  15.     header('Expires: 0');
  16.     header('Cache-Control: must-revalidate');
  17.     header('Pragma: public');
  18.     ob_clean();
  19.     flush();
  20.     readfile($fichero);
  21.     exit;
  22. }else{
  23. echo "Archivo inexistente";
  24. }
  25.  
  26. }else{
  27. echo "No permitido";
  28. }
  29.  
  30. }else{
  31. echo "No autorizado";
  32. }
  33. ?>

Le puse algunas condiciones extras para que veas como trabaja.
Usa readfile() que lee un archivo desde una ruta en el disco, vale decir que si querés más seguridad podrias poner tus pdf por fuera del documentRoot (es decir una carpeta no accesible desde el navegador)

Para el ejemplo tambien cree un archivo sinsesion.php, este en realidad crea una sesion, pero con otro valor, para forzar el error.
Vale decir que tus usuarios nunca abren el pdf directamente, sino un php que lee el pdf y lo muestra, sólo si hay sesion con un valor que vos determinas (sesion que tendrás que crear tras validar usuario y contraseña)

Podes reforzar más aún la restricción, evitando que los pdf se guarden en la cache del navegador, para eso en la carpeta donde esta pdf.php (pdf, en el ejemplo) hay un .htaccess con
Código Apache:
Ver original
  1. addType "application/pdf" .pdf
  2. <FilesMatch "\.(pdf)$">
  3.     Header unset Cache-Control
  4.     Header unset Expires
  5.     Header unset Last-Modified
  6.     FileETag None
  7.     Header unset Pragma
  8. </FilesMatch>

Demo

http://foros.emprear.com/proteger_pdf


Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.