IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

durée de validité [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'"
    Sur quoi vas tu te baser pour savoir si la daté est expirée en faisant une somme ?
    Déjà, faut voir le type de donnée de "AcctSessionTime", et qu'est ce que ça contient.
    Si c'est des dates, faire la somme ne va pas l'faire à mon sens.

    Puis vouloir calculer la durée d'accès de chaque abonné, pourquoi pas, mais ce n'est plus du tout la même chose.

    - Soit il s'agit d'une durée d'échéance (3, 6, 12 mois) à partir de la date de souscription, ce qui est largement plus simple.
    - Soit c'est un temps maxi d'accès au service, ce qui sous entend enregistrer chaque durée d'accès. Là, c'est loin d'être simple.


    Mais il me semble qu'on t'as donné une solution, elle me semble la plus simple et logique.
    Au départ la personne souscrit un abonnement selon une durée, une date d'échance : 3, 6 ou 12 mois.
    Et il suffit à la création de l'abonnement de stocker cette date d'échéance, soit la date en cours + la durée.
    Un champ de type DATETIME fera très bien l'affaire à mon sens.

    Ensuite, à chaque identification il suffit de comparer la validité de cette date : que la date en cours soit inférieur à la date d'échéance.


    A mon sens, essai déjà de définir, ne serait sur papier la manière de gérer cet abonnement, après, une fois validé, suffira de voir comment le mettre en place (les codes).
    Là, tu cherche une solution technique avant de savoir comment faire à mon sens, non ?


    Après, concernant Prestashop et Freeradius, je ne connais pas non plus.
    Ils doivent avoir une doc, ou consulter leur forum, ou au pire leur demander.

  2. #22
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    J'ai opté pour prestashop par soucis de facilitée, inscription, payement etc tout y est déjà. Mais cela s'arrête là car c'est freeradius qui prends la suite pour ce qui identification et gestion.

    Effectivement, actuellement on calcule la durée d'accès de chaque abonné et ce n'est pas ce que je cherche.

    Je pense que la solution la plus judicieuses serait de créer un champ avec la date d'expiration d'abonnement puis le comparer avec la date actuelle.

    J'ai trouvé sur la toile une multitude des codes sql pour comparer les dates comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM radcheck WHERE date_abonnement >= NOW();
    Mais il y a un truc que je ne comprends pas (désolé je suis une bille dès que ca touche au code) par rapport à cette ligne (qui se trouve dans ma configuration actulle):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}
    '"


    Je vois qu'on lui dis de prendre la somme de champ AccSessionTime sur la table radacct puis c'est tout..mais il faut bien le comparer à quelque choses et de lui dire true ou false non? Ca doit se faire dans un autre fichier je présume?

    Peut -t-on dans la ligne query lui interdire la connexion si la date est inférieure à la date actuelle?

  3. #23
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    ... qui se trouve dans ma configuration actulle
    La requête que tu montre à mon sens est faite pour récupérer le nombre de fois que la personne a accédé après identification.
    Y toucher ne serait pas une bonne idée, cette donnée est peut être déjà exploitée ailleurs qui sait.
    Puis la logique qui suit celle ci risque ne pas convenir par rapport à ce que tu souhaite faire.

    Il devrait avoir une identification de déjà faite, car la donnée dynamique {%k} doit correspondre au nom de la personne, elle doit être forcément déjà connue à ce stade.

    La logique veut qu'il y a eu quelque chose d'autre avant, il faudrait alors agir avant.
    Une fois l'identification faite, il faudrait juste après faire une autre requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT COUNT(*) AS total
    FROM radcheck WHERE date_abonnement >= NOW()
    En supposant que le champ "date_abonnement" soit bien dans cette table "radcheck".
    En supposant qu'il soit aussi judicieux de le mettre là (j'en sais fichtre rien).

    Cette requête retourne théoriquement : 0 ou 1 (la date est valide : 1, ou pas : 0).

    Cependant, est ce qu'il t'es possible de faire une requête ?
    De récupérer son résultat ?
    De coder en exploitant cette donnée ?


    Sérieux, il faut que tu te tourne vers ces gens qui ont créé cet environnement (Prestashop, Free...), ça ne va pas être possible sinon.
    Ils doivent te permettre de faire ça, au moins comment interagir (de la doc quoi), sinon, à quoi ça sert de payer un Soft s'il faut coder et surtout tout deviner soit même

    D'ailleurs, ce Soft ne prévoit il pas quelque chose de plus ou moins similaire sous forme d'ajout de modules, addons, plugin, etc ... ?

  4. #24
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    En fait la solution proposé par freeradius consiste:

    1. Enregistrer le nombre de secondes dans un champ value de la table radcheck

    2. à chaque connexion le nombre de secondes est enregistré dans la table radacct champ acctsessiontime

    3. Ensuite la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}
    comptabilise la somme.

    Il me reste à trouver dans quel fichier on trouve le code qui compare la somme AcctSessionTime avec celle de champ value de la table radcheck.

    J'ai parcouru la doc et je n'ai rien trouvé. Il faut dire aussi que la doc n'est pas très complet pour un soft "le plus utilisé" il faut ouvrir fichier par fichier et lire les explications dans les commentaires...

    J'ai demandé de l'aide sur le site officiel mais pour le moment pas de réponse et j'ai parcouru tous leur forum en vain..

    Peut être que je ne cherche pas de bon coté? Il faut peut être voir s'il n y pas d'une solution indépendante à freeradius? Comme mettre en place un crontab? Ou une autre?

    merci en tous cas pour vos lumières

  5. #25
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Il me reste à trouver dans quel fichier on trouve le code qui compare la somme AcctSessionTime avec celle de champ value de la table radcheck.
    Ils te proposent toujours la durée d'accès de chaque abonné.

    Leur solution ne correspond pas du tout à ce que tu souhaite faire.
    Sérieux, tu ne pourras strictement rien faire avec ça.

    La durée d'accès ne te diras jamais quand l'échéance arrivera au bout : soit 3, 6 ou 12 mois.

    Pour ça, il faut au minimum que cette durée y soit, peu importe la manière, à condition que ça soit exploitable après quand même.

    - Soit ils te permettent d'enregistrer 1 seule et unique fois cette durée au moment de la création, ça peut être tout banalement 3 (ou 6 ou 12).
    Rien que ça peu permettre de faire un calcul avec la date en cours lors de l'identification.

    - Ou mieux, directement la date d'échéance : date en cours + la durée lors de la création, donc toujours à faire 1 seule fois.

    Bref ... il n'y pas de mise à jours de d'insertion à chaque connexion, et encore moins de somme à faire.
    C'est bien plus simple que ça.

    Sérieux, c'est quand même pas le bout du monde d'enregistrer une date ou un nombre, et récupérer ça après.

    Ou alors, tu abandonne l'idée de proposer plusieurs durées, donc une seule, alors là peut être qu'avoir 1 date de création de l'abonnement suffira.
    Mais là encore on s'en fiche de savoir la durée d'accès, il faut juste cette date de création, et la comparer avec la date en cours.


    Bref ... soit tu leur as mal expliqué ce que tu souhaitais, soit c'est trop simple pour eux, donc pas assez compliqué (faut qu'ils en rajoutent).
    C'est tout l'impression que ça me donne.

  6. #26
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    Je crois que je m'approche au but (ou pas)

    Je récapitule la situation actuelle qui ne me convient pas:

    Un utilisateur a un abonnement exprimé en nombre de secondes qui est enregistré sur une table radcheck champ value.
    A chaque connexion/déconnexion les deux dates sont enregistrés sur une autre table (radacct) . Sur cette même table on a un champ nommé acctsessiontime où on trouve le nombre de secondes passé sur le serveur.

    La requête query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'" compte le temps total passé sur le serveur.

    Ensuite c'est la module rlm_sqlcounter qui compare le résultat obtenu par la requête avec la valeur dans la table radcheck puis en fonction de résultat obtenu laisse (ou pas) à un utilisateur de se connecter.

    Vu qu'on ne peut pas modifier le module (de tout façon c'est hors de ma porté même si je disposai de la code source) je pensais à une autre solution mais j'aurai besoin votre aide pour le code.

    1. On enregistre toujours l'abonnement en nombre de secondes dans la table radcheck champ value
    2. Dans la table radacct on enregistre la date de suscription (champ date_abonnement).

    Donc il me faudrait une requête qui trouve le nombre de secondes entre le champ date_abonnement et la date actuelle pour le reste c'est rlm_sqlcounter qui va s'en charger.

    EDIT: désolé on s'est croisé mais on gros tu dis la même choses que moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    - Soit ils te permettent d'enregistrer 1 seule et unique fois cette durée au moment de la création, ça peut être tout banalement 3 (ou 6 ou 12).
    Rien que ça peu permettre de faire un calcul avec la date en cours lors de l'identification.
    En fait je peux tout faire: ajouter des dates, les mettre en nombre de secondes mais au final il faut que ca soit le module rlm_sqlcounter qui compare le résultat dans sur la table radcheck dans le champ value qui lui doit etre exprimé en secondes.

  7. #27
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Donc il me faudrait une requête qui trouve le nombre de secondes entre le champ date_abonnement et la date actuelle pour le reste c'est rlm_sqlcounter qui va s'en charger.
    L'exemple de requête que je t'ai donné le fait, ça fait directement la comparaison entre ces 2 dates.

    Peut être ne le sais tu pas, mais sur les systèmes Unix/Linux, qui est très certainement ton cas (à confirmer quand même), toutes les données de date sont exprimées en secondes.
    En faite, la base de ces dates, donc la valeur 0 (pour 0 seconde) début le 01 Janvier 1970 (c'est comme ça).
    Ca veut dire que la date d'aujourd'hui, c'est le nombre de secondes qu'il y eu entre le 01/01/1970 à aujourd'hui, soit : 1293683829 secondes (en gros)

    La fonction time() de Php ou la fonction NOW() coté MySQL renvoient ce nombre de secondes.
    On appel ça le temps UNIX ou UNIX TIMESTAMP.

    Du coup, 3 mois par exemple revient à faire 1293683829 + 7776000 (en gros).
    Donc le principe de cette date d'échéance est beaucoup plus simple que ça en a l'air.


    Le truc qu'ils proposent qui est d'enregistrer à chaque identification la date en cours et le nombre d'accès, tout ça est 100% inutile dans ton cas.
    Il faut abandonner cette idée là, tu ne pourra rien faire avec ça.


    Tu dis que tu peux faire ce que tu veux.
    Et bien question :
    - Est ce que tu peux créer un champ de type "date" exprimé en seconde (temps UNIX) pour justement enregistrer ce temps en secondes qui sera la date d'échéance selon un choix au départ (3,6 ou 12 mois) ?
    - Est ce possible que ça se fasse qu'1 seule fois, soit lors de la création de chaque abonnement et uniquement ?
    - Puis est ce possible d'exécuter la requête d'exemple que j'ai mis auparavant, qui fait explicitement la comparaison à chaque identification (soit 0 ou 1, donc soit l'identification est valide ou pas) ?

    Si ça n'est pas possible, alors là ???

  8. #28
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    Effectivement il s'agit de Debian et j'était au courant sur le principe de TIMESTAMP.

    1.
    Il n y qu'une choses qui m'est imposé c'est la table radcheck. Je doit impérativement mettre la durée d'abonnement (exprimé en secondes) dans cette table et impérativement dans le champ value (en VACHAR). Car, comme je disais plus haut, c'est là que le module rlm_sqlcounter va chercher la durée d'abonnement.

    Le problème ce que dans cette même table et ce même champ j'ai le nom d'utilisateur avec son mdp, exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    username 	attribute 	               op 	       value 
    thomas 	Cleartext-Password 	:= 		mon_mdp
    thomas	Max-All-Session 	        := 	        86400
    Si je change le champ value en datetime ca ne va pas aller je pense?

    2. Exemple: Un utilisateur souscris un abonnement d'un mois (2592000 secondes) qui sera conservé dans le champ value, au renouvellement ce même utilisateur prends un abonnement de 3 mois (7776000 secondes) qui sera lui aussi conservé dans le cmap valu (en faite il va écraser le valeur précédent)

    3. Je ne pense pas que ta requête me convienne, il me faut simplement une qui retourne le nombre de secondes entre la date (par exemple) d'hier et celle d'aujourd'hui

    Je ne sais si tu vois ce que je veux dire?

  9. #29
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    EDIT:

    Après la réflexion il me faut simplement une requête qui compte le nombre de secondes (ou jours) à partir d'une date donné

  10. #30
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    J'essaye avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "SELECT DATEDIFF('date_abonnement', 'CURDATE()') FROM radacct WHERE UserName='%{%k}'
    "

    Mais cela ne marche pas.. par contre si je remplace les noms des champs par des dates alors ca marche

  11. #31
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    Bon, j'ai trouvé une solution qui finalement était assez simple..

    Je récapitule (ca serviras à quelqu'un peut être):

    Dans la table radcheck j'ai créé un champ date supplémentaire (où on mettra la date de souscription d'abonnement) nommé debut_abn

    Dans le champ value on mets la durée d'abonnement exemple: 90 (jours)

    Puis dans radiusd.conf la requête sera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT DATEDIFF(curdate(), debut_abn) FROM radcheck WHERE UserName='%{%k}'"
    Qui en faite compte la différence entre la date courante et celle de debut_abn. Dès que la valeur est égal ou supérieure à 90 le module rlm_sqlcounter empêchera de se connecter.

    Vous aviez raison, j'aurai du m'assoir et mettre tout ca sur le papier avant de me lancer

    Merci en tous cas

  12. #32
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    Peut être cela sera utile à quelqu'un:

    Freeradius peut gérer les abonnements avec "Password Expired" grâce au module rlm_expiration...

    Ce n'était pas la peine de réinventer la roue.....

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Limitation de la durée de validité de l'appli ?
    Par bastringue dans le forum Sécurité
    Réponses: 4
    Dernier message: 06/05/2008, 21h31
  2. Durée de validité d'un mot de passe
    Par aicfr dans le forum Sécurité
    Réponses: 1
    Dernier message: 09/12/2006, 14h45
  3. [nom de domaine] durée de validité
    Par sympho dans le forum Domaines
    Réponses: 3
    Dernier message: 18/12/2005, 13h08
  4. [CGI] durée de validité de HTTP_AUTHORIZATION
    Par didier.cabale dans le forum Autres langages pour le Web
    Réponses: 13
    Dernier message: 26/05/2005, 12h19
  5. Durée de validité d'un export
    Par Righetto Dominique dans le forum Linux
    Réponses: 3
    Dernier message: 07/04/2004, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo