JeuWeb - Crée ton jeu par navigateur
Roles - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Roles (/showthread.php?tid=5067)



Roles - Thib4s - 06-08-2010

Bonjour les gens,

Voila je post aujourd'hui pour vous demander si ma procédure pour gérer l'accès aux pages.

1. le fonctionnement.
J'ai ma table User qui contient un champ roles, dans celui-ci je stocke tous les droits du joueur de la manière suivante : roles = "001::006::020"
ou 001, 006 et 020 sont les droits du joueur.
Chaque page est protégée par une méthode has_roles(["001", "007"])
Cette méthode décompose la chaine "001::006::020" en un array.
et vérifie si ceux-ci correspondent à ceux de la protection.
Si ils ne correspondent pas alors on redirige le visiteur.


RE: Roles - niahoo - 06-08-2010

salut,

ta base de données n'est pas en troisième forme normale, c'est considéré comme une faiblesse au niveau des performances et de la logique globale des données. Mais surtout, ça t'oblige à travailler avec des chaînes de caractères, ce qui t'enlève beaucoup de performances par rapport à des entiers.

ceci dit, ça me semble quand même pratique si tu as besoin régulièrement d'aller directement lire dans ta table user.

Et pour faire mon chieur, si ce sont tes utilisateurs qui ont des rôles, alors tes pages n'en ont pas, j'appellerais plutot la méthode 'require_role' plutot que 'has_role' !


RE: Roles - Anthor - 10-08-2010

(06-08-2010, 08:29 PM)niahoo a écrit : ta base de données n'est pas en troisième forme normale, c'est considéré comme une faiblesse au niveau des performances et de la logique globale des données. Mais surtout, ça t'oblige à travailler avec des chaînes de caractères, ce qui t'enlève beaucoup de performances par rapport à des entiers.

D'un autre côté il cherche avec l'ID du joueur pas avec le champs role, je doute qu'un si simple explode change quoi que ce soit a ces performances.


RE: Roles - niahoo - 10-08-2010

Comparer des chaînes c'est bien plus long que comparer des entiers, c'est un fait, mais si t'as 3 requêtes par minutes sur le serveur c'est clair que ça ne changera strictement rien.


RE: Roles - Sephi-Chan - 10-08-2010

Les solutions de sérialisation maison, ça sent un peu le pâté, d'autant qu'ActiveRecord gère ça très bien avec la méthode serialize..

Ainsi, il te suffit de définir ton modèle ainsi :


class User < ActiveRecord::Base
serialize :roles

# Tout le reste de ton modèle…
end

Ta table users devra avoir une colonne roles doit être de type text. Cela te créera une panoplie de méthodes pour manipuler un tableau Ruby dont la sérialisation (en YAML) et la désérialisation seront automatiquement effectuées sera automatiquement effectuées à la sauvegardes et à la récupération des objets.


@user = User.find(1)
@user.roles << 'administrator' # Maintenant roles contient le tableau [ 'administrator' ]

if @user.roles.include?('writer') # Mais non ! Le tableau ne contient pas 'writer' !
puts "You are a writer!"
end

@user.save
# Dans la base de données, la colonne roles contient maintenant :
# ---
# - administrator

C'est tout de même plus simple quand c'est géré pour toi, non ? Smile

Pour tes rôles, tu peux utiliser Declarative Authorization, on utilise ça au boulot sur une application et c'est vraiment sympa et assez flexible. En plus, il y a un tutoriel vidéo : Railscasts 188 - Declarative Authorization (c'est du Rails 2 mais c'est très simple à adapter).


Sephi-Chan