Avatar billede c-sharp Nybegynder
07. januar 2004 - 12:59 Der er 13 kommentarer og
4 løsninger

Dynamisk menu alt efter hvilken bruger der er logget ind

Jeg skal have lavet en menu som består af 5 punkter. Alt efter hvilke rettigheder brugeren der logger ind har bliver disse punkter vist.  eks. en bruger kan have adgang til 3 af punkterne, en anden til dem alle. Menuen figurer på alle siderne.

Hvordan laver jeg denne menu smartest?

jeg har lavet et udkast til menuen i html:

                            <tr>
                                <td width="5%" height="24" colspan="2" bgcolor="#000000" class="menu_Alm"><div align="center"></div>
                                </td>
                                <td width="8%" bgcolor="#000000" class="menu_Alm"><div align="center"><a href="">Forside</a></div>
                                </td>
                                <td width="9%" bgcolor="#000000" class="menu_Alm"><div align="center">Nyheder</div>
                                </td>
                                <td width="13%" bgcolor="#000000" class="menu_Alm"><div align="center">Nyhedsbrev</div>
                                </td>
                                <td width="12%" bgcolor="#000000" class="menu_Alm"><div align="center">Medarbejder</div>
                                </td>
                                <td width="10%" bgcolor="#000000" class="menu_Alm"><div align="center">Fri side</div>
                                </td>
                                <td width="11%" bgcolor="#000000" class="menu_Alm"><div align="center">Ugenstilbud</div>
                                </td>
                                <td width="32%" bgcolor="#000000" class="menu_Alm" align="right">
                                    <asp:Button id="logaf" runat="server" Text="Log af" BorderStyle="None" ForeColor="White" BorderColor="Black"
                                        BackColor="Black"></asp:Button>&nbsp;&nbsp;</td>
                            </tr>
Avatar billede jps6kb Novice
07. januar 2004 - 13:10 #1
Ehm. uden at komme ind på koder osv. kan du jo i din access-database lave
user | password | rights

jps6kb | test | level3

og så lave menuen så at den henter rights fra den bruger der er logget ind og includer en fil der hedder level3.inc eller ligger menuen i en DB som hedder level1, level2, level3 osv...
Avatar billede ha9953 Nybegynder
07. januar 2004 - 13:11 #2
Hvis du formsautentication kan du tjekke om brugeren har fået tildelt en bestemt rolle og så f.eks sætte et menupunkt til visible:

        If Context.User.IsInRole("admin") then
            TxtAdmin.visible = true
        End If
Avatar billede c-sharp Nybegynder
07. januar 2004 - 13:16 #3
Nu er den sådan at der er mange kombinations muligheder mellem de 5 punkter, en akn have adgang til punkt1 en anden til punkt5 en treide til punkt4 og punkt5 osv.

Hvad med menu'en kan jeg lave den et sted og impotere den i alle siderne, eller er det ikke det smarteste?
Avatar billede ha9953 Nybegynder
07. januar 2004 - 13:19 #4
det smarteste vil være at lave en custom control og så hente den in dpå alle siderne - så kal du kun arbejde med menuen et sted
Avatar billede nielsbrinch Nybegynder
07. januar 2004 - 13:52 #5
Man kunne også lave en statisk metode et sted, som returnerer en menu alt efter hvilket niveau den modtager. Så skal man også kun arbejde med menuen ét sted.
Avatar billede hnteknik Novice
07. januar 2004 - 14:07 #6
Du trækker menuen fra en database, hvor hvert punkt har et userlevel.

Hver menu sammensætning for hvert userlevel lægger du ud i appl. variable.
hver side har et script, som
checker udserlevel
henter menusammensætninger for userlevel,
hvis appl. var er tom læs den ind igen.
lav et admin modul som kan opdatere menupunkterne o gopdater appl. var.

Det er ikke så svært. Se den menustruktur som eksperten bruger på

www.dhtmlcentral.com du skal blot tilføeje userlevel som et nyt felt.

Henrik
Avatar billede c-sharp Nybegynder
07. januar 2004 - 14:21 #7
Jeg har prøvet at lave en custom control (ved ikke så meget om det), men hvordan får jeg html ind i den jeg har jo kun en .cs fil (som bliver til en dll).
Avatar billede c-sharp Nybegynder
17. januar 2004 - 14:01 #8
Bør jeg hente de menu punkter i db for hverside, eller skal jeg oprette en session med et array over de menu punkter brugeren har adgang til, ved login. Så spares mange kald til databsen, men brugen af session frarådes også mange steder.

Hvad bør man gøre?

nielsbrinch: smid lige et svar så du også kan få del i point'ne!
Avatar billede hnteknik Novice
18. januar 2004 - 16:02 #9
Jeg gemmer variabler i applikationvariable og skal kun genindlæses, hvis webserveren genstarter eller du opdaterer menupunkterne i databasen. Jeg har ikke oplevet problemer med Applikationsparametere på en site med +3.000 brugeradgange. Jeg smider lige lidt kode, så du kan se hvorn det gjøres ( Baseret på DHTMLCENTRAL kode):

<%
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ASP CODE START - READING ITEMS FROM THE DATABASE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
function readItemsFromDatabase(){
%>
<!--
<!--#include file="../Conn/mysqlconn.asp" -->
//--->
<%
  var q = "SELECT * from tblMenu WHERE userlevel<=" + Session('userlevel') + " ORDER BY parent,menuID ASC"
  var rs=Server.CreateObject("ADODB.Recordset")
  rs.CacheSize = 25;         // Cache data fetching
  rs.CursorType = 3
  rs.LockType = 3
 
  //Opening database --- --
  rs.Open(q,db)
 
  //Now using getRows because that's so sexy :}
  if(!rs.EOF){
    var rsarr = rs.GetRows();
    rsarr = rsarr.toArray();
    var cols= rs.Fields.Count //Setting how much to add to row each for
  }else var rsarr=new Array()
 
  //Closing database, we don't need it anymore - we have the info in the array
  rs.close()
  rs = null
 
  var menuID,mName,mLink,parent,mSpace,mFunc
  Application('menu'+ Session('userlevel')) = "" ;//nulstill for gud skyld

  for(row=0;row<rsarr.length;row+=cols){ //Looping rows
    //Setting variables
    menuID = "m" + rsarr[row]
    mName = rsarr[row+1]
    mLink = String(rsarr[row+2])
    if(mLink=="null") mLink=""
    parent = rsarr[row+3]
    if(parent!=0) parent = "m" + parent
    else parent=""
    mExtern = String(rsarr[row+5])
    if(mExtern=="null") mExtern="in"
    if(mExtern == 'in') {
    //Making menu item
    Application('menu'+ Session('userlevel')) += "oM.makeMenu('"+menuID+"','"+parent+"','"+mName+"','"+mLink+"')\n";
    //Response.Write("oM.makeMenu('"+menuID+"','"+parent+"','"+mName+"','"+mLink+"')\n");
    }
    else
    {mSpace = ",'','','','','','','','','','',";
    //oMEdit.makeMenu('m18','m2','Nyheder','','','','','','','','','','','','adminmenu(18,"Nyheder","default.asp?scID=22",1,"in")')
    mFunc= "'var abc=window.open(\"" + "http://"+mLink+"\",\"abc\",\"width=800,height=600,scrollbars=yes,location=yes,resizable=yes,status=yes,menubar=yes,toolbar=yes\");abc.window.focus();"
    Application('menu'+ Session('userlevel')) += "oM.makeMenu('"+menuID+"','"+parent+"','"+mName+"',''" +mSpace+mFunc+"')\n";
    }
  }
      if (!Session('userlevel')) {
        // logud
        //Application('menu'+ Session('userlevel') ) += "oM.makeMenu('m0','','Log ind','/PFadm/apw.asp')\n";
        Application('menu'+ Session('userlevel') ) += "oM.makeMenu('m0','','Log ind','PFadm/apw.asp')\n";
        } else {
        // logind
        //Application('menu'+ Session('userlevel') ) += "oM.makeMenu('m0','','Log ud','/logud.asp')\n";
        Application('menu'+ Session('userlevel') ) += "oM.makeMenu('m0','','Log ud','logud.asp')\n";
        }
}
//Calling function
if ((Application('menu'+ Session('userlevel'))=="") ||(typeof(Application('menu'+ Session('userlevel')))=="undefined"))
    {
    Application('menu'+ Session('userlevel'))="";
    readItemsFromDatabase();
    }
Response.Write(Application('menu'+ Session('userlevel')));
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ASP CODE END - READING ITEMS FROM THE DATABASE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
%>
Avatar billede c-sharp Nybegynder
19. januar 2004 - 07:00 #10
Hvis jeg skulle omskrive din ide til mit system, så skulle jeg jo have alle brugerne af mit system til at ligge i applikationsvariablen, med oplysninger om hvilke sider de har ret til at se. dvs. måske 100 - 200 bruger med hver mellem 1 - 20 sider de har adgang til. Det bliver da til en del data der skal ligge i hukommelsen.
Avatar billede hnteknik Novice
19. januar 2004 - 20:22 #11
Du er nød til at opdele dine brugere i et antal katergorier.
Når de logger på tildeles de et userlevel, som gemmes i en sesionvariabel, som kun lever så længe brugeren er på. I det beskrevne system er der 5 brugerniveauer, hvor der er kaskadevis adgang. 5 kan også se niveau 4,3,2,1 osv. "WHERE userlevel<=" + Session('userlevel')" det kan jo blot laves om.

Hvis dine brugere er så vidt forskellige, at du får brug for at gemme mere end say 5-10 applikationsvariable, er der jo ikke vundet noget ved at gemme det i en applikatonsvariable men bedre i en sessionvariabel.
Avatar billede c-sharp Nybegynder
20. januar 2004 - 20:03 #12
Så det jeg bør gøre er følgende:

Når brugeren logger ind laver jeg et array med de sider som bruger har ret til at se. så når man navigere rundt i menuen (som bliver loadet på hver side), henter man bare arrayet i stedet for at spørge i databasen. Er dette den optimale løsning i mit tilfælde?

Jeg bruger dette array til at checke at brugeren er logget ind, dvs hver side kontrollere i arrayet om den er nævnt, hvis den er det vises siden (dette er kun aktuelt hvis brugeren kender den direkte URL til siden, for i menuen vises kun de sider som brugeren har adgang til).

Nogen kommentar?
Avatar billede hnteknik Novice
20. januar 2004 - 21:13 #13
Du kan bruge userlevel == userid i dit tilfælde.
På hver side checker du først om bruger er på:
<%if(typeof(Session('userlevel')) == 'undefined' ) {
    Response.Clear;
    Session('GoBack')=Request.ServerVariables('SCRIPT_NAME').Item ;
    //Session('Retur')=Request.ServerVariables('HTTP_REFERER');
    Response.Redirect('loginside);
    Response.End;
}%>


Dernæst henter du indholdet i din sessionvariabel ( i mit script foroven appl. var)
Hvis ikke indlæst så indlæs osv.:

if ((Application('menu'+ Session('userlevel'))=="") ||(typeof(Application('menu'+ Session('userlevel')))=="undefined"))
    {
    Application('menu'+ Session('userlevel'))="";
    readItemsFromDatabase();
    }

Det kan ikke forhindre, at man forsøger den direkte metode. Så må du også have et check på hver side, a la: if(Session('userlevel') != 4) Response.Redirect('scrupaf.asp');

Det bliver lidt besværligt, hvis du ikke har delt dine brugere op i nogle kategorier.
Avatar billede hnteknik Novice
20. januar 2004 - 21:14 #14
ØH vb-begynder - skulle det have været i vb ?
Avatar billede c-sharp Nybegynder
20. januar 2004 - 21:16 #15
Nej det VB blev aldrig rigtig til noget :-)
Avatar billede hnteknik Novice
05. februar 2004 - 14:01 #16
???
Avatar billede c-sharp Nybegynder
11. februar 2004 - 06:32 #17
Jeg har valgt at lave menuen som en user control, og ligge en liste af de sider den indloggede bruger har ret til at se i en session.

Jeg takker for jeres indlæg!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester