2009-06-02 7 views
0

Nous avons un site sur lequel la navigation de gauche a beaucoup de liens. Ces liens sont peints en fonction de la fonction d'un utilisateur. Il y a un écran où un utilisateur Admin peut Créer une nouvelle fonction et l'assigner à certains utilisateurs. Le problème est qu'une fois la nouvelle fonction créée, notre code doit être changé car dans notre page de navigation gauche nous avons beaucoup de clauses if/else, sur la base desquelles nous peignons les liens.Structure pour gérer l'accès des utilisateurs sur un site

Suite est la structure des tables concernées:

cmp_user_role [userid, role_id] 
cmp_function [function_id, function_name, url] 
cmp_function_role [role_id, function_id] 

données Exemple:

cmp_user_role [userid, role_id] 
M23423 18 
H23414 21 
G23431 44 

cmp_function [function_id, function_name, url] 
0 SystemAdmin Null 
1 Debt Access Null 
8 Audit Reports Null 

cmp_function_role [role_id, function_id] 
18 0 
18 1 
21 8 
44 1 

La requête qui apporte la liste des fonctions par rapport à un code d'utilisateur est:

SELECT f.function_id, f.function_name 
FROM cmp_function f, cmp_function_role p 
WHERE p.role_id 
IN (SELECT DISTINCT role_id FROM cmp_user_role 
WHERE user_id = 'M23423') 
AND p.function_id=f.function_id 

et dans notre code nous faisons (pseudo)

if (retrievedFunctionFromDB == "SystemAdmin") 
    show links pertaining to system Admin 
if (retrievedFunctionFromDB == "Debt Access") 
    show links pertaining to Debt Access 
... 

Je pense que tout est ok sauf lorsque l'utilisateur décide de créer une nouvelle fonction et attribue cette fonction à un utilisateur. Dans ce cas, notre code n'a pas ce nom de fonction puisque nous le codons en dur.

Quelle est la meilleure stratégie pour rendre cette dynamique sans changer une grande partie de la structure de la table.

Répondre

1

Je pense que vous pouvez ajouter la table

cmp_function_links [function_id, link_url, link_text] 

Et le pseudo-code (pour les liens d'impression) devrait être

fetch all roles where user is 
for each role 
    print all links 

Je suppose que vos liens sont statiques, pas dynamiques (comme lien vers le dernier utilisateur , etc).

Questions connexes