|
| gemme ID fra dynamisk form side Fra : Christian M. Nielsen |
Dato : 07-01-06 18:23 |
|
Hej gruppe.
Jeg arbejder på noget adgangskontrol, og vil derfor gerne kunne bestemme
hvilke kategorier brugeren har ret til at åbne. Kategorierne kan ændre sig
dynamisk og har alle et fast id (autonummerering).
Jeg er dog lidt på bar bund hvordan jeg skruer det sammen, så jeg kan gemme
værdien for de kategorier brugeren må have lov til at se, og vil derfor
gerne have lidt ideer til at arbejde videre med.
Hvis jeg laver en checkboks ud for hver kategori, så kan jeg jo se om den er
afkrydset, men hvordan gør man det når jeg ikke kender antal af kategorier?
Jeg forestiller mig at gemme en tekststreng med værdierne adskilt af et
komma, og når brugeren logger ind, så putte værdierne et array og loope
igennem. Dette har jeg styr på.
Nogen der har ideer?
Hvis jeg skal forklare yderligere, så bare sig til.
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Torben Brandt (08-01-2006)
| Kommentar Fra : Torben Brandt |
Dato : 08-01-06 04:47 |
|
Christian M. Nielsen wrote in dk.edb.internet.webdesign.serverside.asp:
> Jeg arbejder på noget adgangskontrol, og vil derfor gerne kunne bestemme
> hvilke kategorier brugeren har ret til at åbne. Kategorierne kan ændre sig
> dynamisk og har alle et fast id (autonummerering).
>
> Jeg er dog lidt på bar bund hvordan jeg skruer det sammen, så jeg kan gemme
> værdien for de kategorier brugeren må have lov til at se, og vil derfor
> gerne have lidt ideer til at arbejde videre med.
>
> Hvis jeg laver en checkboks ud for hver kategori, så kan jeg jo se om den er
> afkrydset, men hvordan gør man det når jeg ikke kender antal af kategorier?
De to linier herover forstår jeg ikke... :)
> Jeg forestiller mig at gemme en tekststreng med værdierne adskilt af et
> komma, og når brugeren logger ind, så putte værdierne et array og loope
> igennem. Dette har jeg styr på.
Umiddelbart lyder det ikke som en rar idé :)
Eksempel på database:
Bruger | AdgangTilKategorier
--------------------------
Anders | 1,2,3,7,8
Bent | 3,8
Carsten | 4
Hvis du så sletter kategori 3, så er det besværligt også at fjerne alle
adgangsregistreringer i databasen uden at pille dem alle ud, ændre dem og sætte
dem ind igen.
Også besværligt at give alle rettigheder til en kategori, hvis fx nogle
allerede har det.
> Nogen der har ideer?
Masser! - men garanterer ikke for kvaliteten :)
Hvis du har en brugertabel, og en tabel med kategorier, så kunne du oprette
endnu en tabel (kaldet fx Adgang), der består af to kolonner med de kategorier
brugerne har adgang til:
BrugerId | KategoriId
----------------
Anders | 1
Anders | 2
Anders | 3
Anders | 7
Anders | 8
Bent | 3
Bent | 8
Carsten | 4
Det er så let at tilføje rettigheder (bare tilføje nogle linier), og slette
både enkelt-rettigheder (slet enkelt linie) og alle rettigheder til en nedlagt
kategori (slet alt med Kategori = id).
Det er også nemt (ved at krydse med Kategori-tabellen) kun at trække de
kategorier ud som brugeren har adgang til. Skriv hvis du ønsker kode!
Det er et forslag, som er bedst hvis brugerne har meget individuelle
rettigheder.
Hvis dine brugere snarere er inddelt i relativt få (under 10-15) grupper, så
vil jeg foreslå en anden løsning... Er dine rettigheder delt op i grupper? Og
er det vigtigt at det skal kunne skalere til væsentlig flere grupper end 10-15?
> Hvis jeg skal forklare yderligere, så bare sig til.
Tja, kommer an på hvad du har fået ud af ovenstående, men en ting jeg ikke har
kommenteret er hvordan det forløber ved almindelig drift (kun hvordan
administrationen er).
Det er ikke nok bare at vise brugeren de kategorier han må åbne, hvis han
alligevel klikker sig ind til noget han ikke må se, så skal det også stoppes.
En løsning er ved hver sidevisning at slå op i databasen for at se rettigheden.
Det kan være tungt, men også relativt nemt at overskue.
En anden er at gemme data i en sessionvariabel og så bruge den til at tjekke
rettighederne på siderne. Der er dog for mig ikke den store idé i at lave en
vildt smart database-løsning hvis man så alligevel klasker rettighederne sammen
i en sessionsvariabel uden at tænke over den...
Mit forslag handlede mest op opbygning af databasen, men det jeg har beskrevet
i det sidste afsnit herover er jeg lidt usikker på hvordan data skal "huskes"
mellem siderne. Evt du kunne fortælle lidt om hvordan du havde forestillet dig
at tjekkene skulle foregår på - eller skal jeg/andre komme med nogle forslag ?
mvh Torben
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Christian M. Nielsen (08-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 08-01-06 09:02 |
|
"Torben Brandt" <ukendt1000@hotmail.com> skrev i en meddelelse
news:43c08b36$0$15790$14726298@news.sunsite.dk...
>> Jeg forestiller mig at gemme en tekststreng med værdierne adskilt af et
>> komma, og når brugeren logger ind, så putte værdierne et array og loope
>> igennem. Dette har jeg styr på.
>
> Umiddelbart lyder det ikke som en rar idé :)
Det var også bare en ide, men den er nu forkastet.
>> Nogen der har ideer?
>
> Masser! - men garanterer ikke for kvaliteten :)
> Hvis du har en brugertabel, og en tabel med kategorier, så kunne du
> oprette
> endnu en tabel (kaldet fx Adgang), der består af to kolonner med de
> kategorier
> brugerne har adgang til:
> BrugerId | KategoriId
> ----------------
> Anders | 1
> Anders | 2
> Anders | 3
> Anders | 7
> Anders | 8
> Bent | 3
> Bent | 8
> Carsten | 4
>
> Det er så let at tilføje rettigheder (bare tilføje nogle linier), og
> slette
> både enkelt-rettigheder (slet enkelt linie) og alle rettigheder til en
> nedlagt
> kategori (slet alt med Kategori = id).
> Det er også nemt (ved at krydse med Kategori-tabellen) kun at trække de
> kategorier ud som brugeren har adgang til. Skriv hvis du ønsker kode!
Dette virker smartere Jeg tror jeg kan kode mig ud af det, ellers
spørger jeg igen.
> Det er et forslag, som er bedst hvis brugerne har meget individuelle
> rettigheder.
> Hvis dine brugere snarere er inddelt i relativt få (under 10-15) grupper,
> så
> vil jeg foreslå en anden løsning... Er dine rettigheder delt op i grupper?
> Og
> er det vigtigt at det skal kunne skalere til væsentlig flere grupper end
> 10-15?
Hvad mener du med at dele brugene ind i grupper?
>> Hvis jeg skal forklare yderligere, så bare sig til.
>
> Tja, kommer an på hvad du har fået ud af ovenstående, men en ting jeg ikke
> har
> kommenteret er hvordan det forløber ved almindelig drift (kun hvordan
> administrationen er).
> Det er ikke nok bare at vise brugeren de kategorier han må åbne, hvis han
> alligevel klikker sig ind til noget han ikke må se, så skal det også
> stoppes.
Der bør ikke kunne forekomme situationer hvor man kan klikke sig ind på
noget man ikke har rettighed til at se. Kategorierne man har adgang til er i
en dropdown menu. Siden skal bruges til noget intranet, hvor brugerne ikke
har de store it færdigheder. Noget andet var hvis man havde adgang fra
internettet, så kunne der snart komme nogle med små pilfingre og begynde at
se om de kunne få adgang til de sider de ikke har rettigheder til. Jeg kan
dog forestille mig at smide KategoriId i en session variabel når man logger
ind, og så se om brugeren forsøger at få adgang til en kategori med id der
ikke er givet adgang til. Er dette en ide, eller det som du advarer imod
herunder?
> Der er dog for mig ikke den store idé i at lave en
> vildt smart database-løsning hvis man så alligevel klasker rettighederne
> sammen
> i en sessionsvariabel uden at tænke over den...
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Torben Brandt (08-01-2006)
| Kommentar Fra : Torben Brandt |
Dato : 08-01-06 17:49 |
|
Christian M. Nielsen wrote in dk.edb.internet.webdesign.serverside.asp:
> Torben Brandt skrev:
>
> > Det er et forslag, som er bedst hvis brugerne har meget individuelle
> > rettigheder.
> > Hvis dine brugere snarere er inddelt i relativt få (under 10-15) grupper,
> > så vil jeg foreslå en anden løsning... Er dine rettigheder delt op i
grupper?
> > Og er det vigtigt at det skal kunne skalere til væsentlig flere grupper end
> > 10-15?
>
> Hvad mener du med at dele brugene ind i grupper?
Jeg mener at hvis du har 100 brugere, men de kan deles ind i grupper såsom
- Administrator (1 bruger er medlem her)
- Skolebestyrelse (4 brugere)
- Lærere (30 brugere)
- Elever (65 brugere)
Hvor man er medlem af een gruppe og alle i gruppen har samme rettigheder.
Så er der ingen grund til at knytte hver bruger til hver kategori, men i stedet
kan man knytte en gruppe til hver bruger, og så binde kategorierne til
grupperne.
> > ... en ting jeg ikke har
> > kommenteret er hvordan det forløber ved almindelig drift (kun hvordan
> > administrationen er).
> > Det er ikke nok bare at vise brugeren de kategorier han må åbne, hvis han
> > alligevel klikker sig ind til noget han ikke må se, så skal det også
> > stoppes.
>
> Der bør ikke kunne forekomme situationer hvor man kan klikke sig ind på
> noget man ikke har rettighed til at se. Kategorierne man har adgang til er i
> en dropdown menu. Siden skal bruges til noget intranet, hvor brugerne ikke
> har de store it færdigheder. Noget andet var hvis man havde adgang fra
> internettet, så kunne der snart komme nogle med små pilfingre og begynde at
> se om de kunne få adgang til de sider de ikke har rettigheder til. Jeg kan
> dog forestille mig at smide KategoriId i en session variabel når man logger
> ind, og så se om brugeren forsøger at få adgang til en kategori med id der
> ikke er givet adgang til. Er dette en ide, eller det som du advarer imod
> herunder?
>
> > Der er dog for mig ikke den store idé i at lave en
> > vildt smart database-løsning hvis man så alligevel klasker rettighederne
> > sammen
> > i en sessionsvariabel uden at tænke over den...
Lidt måske... Jeg advarer ikke, men opfordrer bare til at man ikke tænker længe
over en eller anden lille del af processen, men ikke giver samme opmærksomhed
til andre dele, som hænger sammen med...
En ting lige at tænke over er dette eksempel:
Langt de fleste gange brugerrettighedsdelen af sitet kommer i brug er når en
bruger skal se en side og du så undersøger om han må se den. Derfor skal denne
del i hvert fald have mindst samme opmærksomhed som resten af rettighedsdelen.
Hvis vi ser på Anders fra før:
> > BrugerId KategoriId
> > ----------------
> > Anders 1
> > Anders 2
> > Anders 3
> > Anders 7
> > Anders 8
Så vil du (som jeg ser det) når han logger ind lave sessionsvariablen
Session("Kategorier") = "1,2,3,7,8"
eller (hvilket dog essensielt er det samme i denne diskussion)
Session("Kategorier") = Array(1, 2, 3, 7, 8)
Men jeg stiller spørgsmålet:
Umiddelbart kunne jeg ikke lide at gemme data på den måde i databasen (altså
komma-separeret, som også svarer til dit allerførste forslag), men hvis det er i
den form (altså en streng der er komma-separeret) den bruges 9 ud af 10 gange,
så er det vel ikke så slemt også at gemme det sådan..? Så hvorfor vælge en mere
kompliceret struktur for databasen - omend det dog som jeg skrev vil være
nemmere at administrere?
Jeg synes ikke lige jeg kan finde på et svar til hvordan kategori-id'erne bør
gemmes i en sessionsvariabel, men jeg kaster alligevel den bold op i luften til
overvejelse :)
Måske har andre et bud eller nogle erfaringer at dele...
mvh Torben
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Christian M. Nielsen (08-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 08-01-06 21:00 |
|
"Torben Brandt" <ukendt1000@hotmail.com> skrev i en meddelelse
news:43c1428e$0$15781$14726298@news.sunsite.dk...
> Hvis vi ser på Anders fra før:
>> > BrugerId KategoriId
>> > ----------------
>> > Anders 1
>> > Anders 2
>> > Anders 3
>> > Anders 7
>> > Anders 8
Jeg vælger den ovenstående model, pga. den nemmere administration, samt der
er ikke mulighed for at inddele i grupper.
Jeg er dog alligevel ikke sikker på hvordan jeg skal kode mig ud af det, så
et spark i den rigtige retning eller en ide til opbygning af kode vil være
meget velkommen.
Antallet af brugere er dynamisk og det er antallet af kategorier der er
adgang til også. Der er dog færre kategorier end der er brugere.
Jeg kan forestille mig at der skal være to sider til administration.
Man vælger en kategori og får listet det aktuelle antal brugere i en form
med et afkrydsningsfelt ud for hver, så man kan se om de har rettighed eller
ej til kategorien.
Side 1)
strSQL ="SELECT BrugerId, KategoriId FROM tblAdgang WHERE KategoriId
="&Request.querystring("kategoriid")
DO WHILE NOT ors.EOF
??????????
hvordan strukturerer jeg det nemmest samt navngiver felterne i formen?
????????
ors.MOVENEXT
LOOP
Listen skal vel puttes i en form der sendes til side 2?
Side2)
Hvad skal der stå her? Det er jeg meget i tvivl om, hvordan jeg får fat i et
dynamisk antal felter fra formen.
> Jeg synes ikke lige jeg kan finde på et svar til hvordan kategori-id'erne
> bør
> gemmes i en sessionsvariabel, men jeg kaster alligevel den bold op i
> luften til
> overvejelse :)
> Måske har andre et bud eller nogle erfaringer at dele...
Alle kommentarer er velkomne.
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Torben Brandt (09-01-2006)
| Kommentar Fra : Torben Brandt |
Dato : 09-01-06 03:55 |
|
Christian M. Nielsen wrote in dk.edb.internet.webdesign.serverside.asp:
> Torben Brandt skrev:
>
> Jeg er dog alligevel ikke sikker på hvordan jeg skal kode mig ud af det, så
> et spark i den rigtige retning eller en ide til opbygning af kode vil være
> meget velkommen.
Udtræk af den liste af kategorier en bruger må se kan så laves sådan:
SELECT
Kategorier.*
FROM
Adgang
INNER JOIN
Kategorier
ON Adgang.kategoriId = Kategorier.kategoriId
WHERE
Adgang.brugerId = [brugerens id]
Undersøgelse om en bruger må se en bestemt kategori er
SELECT
1
FROM
Adgang
WHERE
(kategoriId = [kategoriens id]) AND (brugerId = [brugerens id])
og så undersøge om recordsettet er tomt.
> Man vælger en kategori og får listet det aktuelle antal brugere i en form
> med et afkrydsningsfelt ud for hver, så man kan se om de har rettighed eller
> ej til kategorien.
Overvej også at lave 'den modsatte', så man for en bruger får listet alle
kategorierne. For hvis man fx opretter en ny bruger, så skulle man ellers ind
på alle kategorierne for at give brugeren rettigheder...
> Side 1)
>
> strSQL ="SELECT BrugerId, KategoriId FROM tblAdgang WHERE KategoriId
> ="&Request.querystring("kategoriid")
Dette vil udvælge alle de eksisterende adgange, men du har også brug for at
krydse med brugertabellen for at få de brugere med som endnu ikke har
rettigheder.
Prøv denne:
SELECT
b.brugerId, b.brugerNavn, CBool(Not IsNull(a.kategoriId)) AS adgang
FROM
Brugere b
LEFT JOIN
(SELECT * FROM Adgang WHERE kategoriId = [kategoriens id]) AS a
ON b.brugerId = a.brugerId
Feltet 'adgang' er så en boolsk værdi, der viser om der allerede er adgang.
> DO WHILE NOT ors.EOF
>
> ??????????
> hvordan strukturerer jeg det nemmest samt navngiver felterne i formen?
> ????????
Du kan noget i stil med
<%= ors("brugerNavn") %>
<% If ors("adgang") Then %>
<input type="checkbox" name="brugerId" value="<%= ors("brugerId") %>"
checked>
<% Else %>
<input type="checkbox" name="brugerId" value="<%= ors("brugerId") %>">
<% End If %>
Det er en pointe at alle checkboxe har samme name, og value så er det der
adskiller dem.
> ors.MOVENEXT
> LOOP
>
> Listen skal vel puttes i en form der sendes til side 2?
Ja, lav en form rundt om ovenstående loop
> Side2)
>
> Hvad skal der stå her? Det er jeg meget i tvivl om, hvordan jeg får fat i et
> dynamisk antal felter fra formen.
Vi sletter først alt om denne kategori
DELETE * FROM Adgang WHERE kategoriId = [kategoriens id]
Du laver nu en løkke over alle Request.Form("brugerId"), som indeholder
brugerId på de afkrydsede checkbokse. Det er præcis dem der skal have adgang:
For i = 1 To Request.Form("brugerId").Count
sql = "INSERT INTO Adgang (brugerId, kategoriId) VALUES (" & _
Request.Form("brugerId")(i) & ", [kategoriens id])"
conn.execute(sql)
Next
> > Jeg synes ikke lige jeg kan finde på et svar til hvordan kategori-id'erne
> > bør gemmes i en sessionsvariabel, men jeg kaster alligevel den bold op i
> > luften til overvejelse :)
> > Måske har andre et bud eller nogle erfaringer at dele...
>
> Alle kommentarer er velkomne.
Jeg kommer lige til at tænke på:
Når man klikker sig ind på en kategori (eller indhold i den kategori) så kommer
indholdet til siden vel fra databasen ?
Hvis ja, så kan man jo bare når man trækker det indhold ud krydse med
adgangstabellen, og så laver man tjekket automatisk, og behøver ikke gemme
noget i en sessionsvariabel...
SELECT
art.*
FROM
Artikler art
RIGHT JOIN
(SELECT * FROM Adgang WHERE brugerId = [brugerens id]) AS adg
ON art.kategoriId = adg.kategoriId
WHERE art.artikelId = [artiklens id]
Så vil recordsettet være tomt hvis enten artiklen ikke findes eller brugeren
ikke har adgang til at se den.
mvh Torben
PS Meget lidt at ovenstående kode er testet, da min computer ikke har det så
godt...
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Christian M. Nielsen (09-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 09-01-06 16:04 |
|
Hej Torben.
Mange tak for koden, jeg vil se på det i aften og over ugen. Hvis jeg løber
ind i problemer under vejs, skal jeg nok henvende mig igen i gruppen.
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Christian M. Nielsen (12-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 12-01-06 20:25 |
|
"Torben Brandt" <ukendt1000@hotmail.com> skrev i en meddelelse
news:43c1d08a$0$15781$14726298@news.sunsite.dk...
> Udtræk af den liste af kategorier en bruger må se kan så laves sådan:
> SELECT
> Kategorier.*
> FROM
> Adgang
> INNER JOIN
> Kategorier
> ON Adgang.kategoriId = Kategorier.kategoriId
> WHERE
> Adgang.brugerId = [brugerens id]
>
> Undersøgelse om en bruger må se en bestemt kategori er
> SELECT
> 1
> FROM
> Adgang
> WHERE
> (kategoriId = [kategoriens id]) AND (brugerId = [brugerens id])
> og så undersøge om recordsettet er tomt.
Jeg er ikke helt med på hvordan jeg skal få det til at hænge sammen med det
jeg har nu. Så vidt jeg kan forstå, så skal jeg oprette en ny tabel med navn
"Adgang"?
I den tabel skal der være følgende kolonner:
1) kategoriId
2) brugerId
3) Kategorier <<< Kan jeg ikke få til at passe ind?
Det jeg har nu er:
En tabel med brugere "tblAdmin" (bruger er identificeret via
autonummerering, men de er oprettet med navn, password og email)
samt en tabel med Menupunkter "tblMenu" (Autonummer, Menunavn)
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Torben Brandt (13-01-2006)
| Kommentar Fra : Torben Brandt |
Dato : 13-01-06 04:48 |
|
Christian M. Nielsen wrote in dk.edb.internet.webdesign.serverside.asp:
>
> Jeg er ikke helt med på hvordan jeg skal få det til at hænge sammen med det
> jeg har nu. Så vidt jeg kan forstå, så skal jeg oprette en ny tabel med navn
> "Adgang"?
> I den tabel skal der være følgende kolonner:
>
> 1) kategoriId
> 2) brugerId
> 3) Kategorier <<< Kan jeg ikke få til at passe ind?
Nej kun
1) kategoriId (refererer til autonummerfeltet i tblAdmin)
2) brugerId (refererer til autonummerfeltet i tblMenu)
og evt en autonummeringskolonne (ikke nødvendig, men jeg synes den slags altid
er rart at have)
Ordet 'Kategorier' har jeg brugt som navn på den tabel du har kaldt 'tblMenu'
Ideen er at hvis der eksisterer en post i Adgang (vi kan også kalde den
tblAdgang, så passer det med hvad du ellers har gjort) med brugerId = 1 og
kategoriId = 5, så har brugeren med id = 1 adgang til kategorien med id = 5.
Hvis der ikke findes sådan en post, så er der ikke adgang.
> Det jeg har nu er:
> En tabel med brugere "tblAdmin" (bruger er identificeret via
> autonummerering, men de er oprettet med navn, password og email)
> samt en tabel med Menupunkter "tblMenu" (Autonummer, Menunavn)
Sammen med tblAdgang som beskrevet ovenfor skulle det være nok.
Så fås fx
Udtræk af den liste af kategorier en bruger må se kan så laves sådan:
SELECT
tblMenu.*
FROM
tblAdgang
INNER JOIN
tblMenu
ON tblAdgang.kategoriId = tblMenu.[autonummerfelt]
WHERE
tblAdgang.brugerId = [brugerens id]
Det skal læses sådan her:
1) Lav INNER JOIN mellem alle kategorier og adgange. Så kommer hver kategori
til at så der lige så mange gange, som der er brugere der har adgang til
kategorien.
2) Så udvælge kun info om den pågældende bruger (WHERE-delen). Så er alle de
kategorier han har adgang til tilbage.
3) Dernæst udvælges felterne fra katogori-tabellen (SELECT tblMenu.*) så der
kan opbygges en liste over kategorier.
(i alle mine eksempler skal '[', ']' og indhold skiftes ud med det der får det
til at passe med dit setup)
Hvis vi skal kigge nærmere på noget kode, så lad os tage et konkret eksempel -
det er nemmere :)
mvh Torben
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Christian M. Nielsen (15-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 15-01-06 19:25 |
|
"Torben Brandt" <ukendt1000@hotmail.com> skrev i en meddelelse
news:43c722db$0$15791$14726298@news.sunsite.dk...
> Udtræk af den liste af kategorier en bruger må se kan så laves sådan:
> SELECT
> tblMenu.*
> FROM
> tblAdgang
> INNER JOIN
> tblMenu
> ON tblAdgang.kategoriId = tblMenu.[autonummerfelt]
> WHERE
> tblAdgang.brugerId = [brugerens id]
>
> (i alle mine eksempler skal '[', ']' og indhold skiftes ud med det der får
> det
> til at passe med dit setup)
Lettere omskrevet så det passer 100% til min
SELECT tblMenuObjects.* FROM tblAdgang INNER JOIN tblMenuObjects ON
tblAdgang.kategoriId = tblMenuObjects.Type WHERE tblAdgang.brugerId =
strAdminID
Når jeg looper igennem recordsettet, får jeg rigtigt nok de kategorier en
given bruger har rettigheder til at se.
Jeg har set lidt på nedenstående, men kan ikke helt gennemskue hvordan det
virker? (omskrevet så det skulle passe med mit setup med mindre jeg har
opfattet det forkert? Det originale forslag er nederst) Hvad er det jeg
udtrækker og hvordan kan det buges i min form [1]?
Der bør sikkert laves et helt andet udtræk, da det vil være smartest at
hente hver bruger og så liste kategorierne, med mulighed for at afkrydse de
kategorier der er adgang til.
SELECT b.AdminID, b.AdminUser, CBool(Not IsNull(a.kategoriId)) AS adgang
FROM tblAdmin b LEFT JOIN (SELECT * FROM tblAdgang WHERE kategoriId =
intKategoriID) AS a ON b.AdminID = a.Admin
SELECT
b.brugerId, b.brugerNavn, CBool(Not IsNull(a.kategoriId)) AS adgang
FROM
Brugere b
LEFT JOIN
(SELECT * FROM Adgang WHERE kategoriId = [kategoriens id]) AS a
ON b.brugerId = a.brugerId
Brugere = tblAdmin (tabel med brugernavn, ID, email O.S.V.)
b.brugerId, = "AdminID" i min tabel tblAdmin
b.brugerNavn = "AdminUser" i min tabel tblAdmin
[1]
<%= ors("brugerNavn") %>
<% If ors("adgang") Then %>
<input type="checkbox" name="brugerId" value="<%= ors("brugerId") %>"
checked>
<% Else %>
<input type="checkbox" name="brugerId" value="<%= ors("brugerId") %>">
<% End If %>
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Torben Brandt (18-01-2006)
| Kommentar Fra : Torben Brandt |
Dato : 18-01-06 01:44 |
|
Christian M. Nielsen wrote in dk.edb.internet.webdesign.serverside.asp:
> Torben Brandt har skrevet i tidligere indlæg i tråden:
>
> Jeg har set lidt på nedenstående, men kan ikke helt gennemskue hvordan det
> virker? (omskrevet så det skulle passe med mit setup med mindre jeg har
> opfattet det forkert? Det originale forslag er nederst) Hvad er det jeg
> udtrækker og hvordan kan det buges i min form [1]?
>
> Der bør sikkert laves et helt andet udtræk, da det vil være smartest at
> hente hver bruger og så liste kategorierne, med mulighed for at afkrydse de
> kategorier der er adgang til.
Jeg er lidt usikker på hvad det præcis er vi er ved at lave, så her kommer to
forskellige løsninger.
Nedenstående udtræk vil _for en enkelt kategori_ liste alle brugere og om de har
rettigheder.
>> SELECT b.AdminID, b.AdminUser, CBool(Not IsNull(a.kategoriId)) AS adgang
>> FROM tblAdmin b LEFT JOIN (SELECT * FROM tblAdgang WHERE kategoriId =
>> intKategoriID) AS a ON b.AdminID = a.Admin
>>
>> SELECT
>> b.brugerId, b.brugerNavn, CBool(Not IsNull(a.kategoriId)) AS adgang
>> FROM
>> Brugere b
>> LEFT JOIN
>> (SELECT * FROM Adgang WHERE kategoriId = [kategoriens id]) AS a
>> ON b.brugerId = a.brugerId
Det vil jeg så bruge til at lave en liste af checkboxe:
>> <%= ors("AdminUser") %>
>> <% If ors("adgang") Then %>
>> <input type="checkbox" name="AdminId" value="<%= ors("AdminId") %>"
>> checked>
>> <% Else %>
>> <input type="checkbox" name="AdminId" value="<%= ors("AdminId") %>">
>> <% End If %>
Husk også at overføre information om hvilken kategori det er - kan evt bruge et
hidden-felt.
Når den form så bliver afsendt, så slettes først alt tidligere information om
adgang til kategorien:
>> DELETE * FROM Adgang WHERE kategoriId = intKategoriId
Og så indsætter vi alle nye rettigheder for den kategori:
>> For i = 1 To Request.Form("AdminId").Count
>> sql = "INSERT INTO Adgang (brugerId, kategoriId) VALUES (" & _
>> Request.Form("AdminId")(i) & "," & intKategoriId & ")"
>> conn.execute(sql)
>> Next
Hvis du skal lave en løsning hvor man _for alle kategorier_ lister alle brugere
og deres rettigheder, så kan du bruge denne fremgangsmåde:
Nedenstående udtræk lister for hver bruger alle kategorierne og om der er adgang
til den enkelte kategori for den enkelte bruger:
SELECT
b.AdminID, b.AdminUser, b.Type, b.TName
Not IsNull(a.brugerId) AS adgang
FROM
(SELECT * FROM tblAdmin, tblMenuObjects) AS b
LEFT JOIN
tblAdgang a
ON
(b.AdminID = a.brugerId) AND (b.Type = a.kategoriId)
ORDER BY
b.AdminUser, b.Type
TName er kolonnen fra tblMenuObjects der indeholder navnet på menuen/kategorien.
Jeg tager den lige trin for trin:
1. Først gør
(SELECT * FROM tblAdmin, tblMenuObjects) AS b
at der danne en (midlertidig) tabel med navn 'b', som indeholder en krydsning
mellem alle brugere og menuer.
Vi skal senere have dannet en checkbox for hver af disse linier, så hver bruger
får en relation (enten adgang eller ikke) til hver menu.
2. Vi sætte så tabellen tblAdgang på denne. LEFT JOIN gør at de oprindelige
linier ikke fjernes. Det gøres
ON
(b.AdminID = a.brugerId) AND (b.Type = a.kategoriId)
så vi for hver linie i 'b' sætter oplysninger fra tblAdgang får den samme bruger
og den rigtige menu.
3. Den tabel vi har nu
(SELECT * FROM tblAdmin, tblMenuObjects) AS b
LEFT JOIN
tblAdgang a
ON
(b.AdminID = a.brugerId) AND (b.Type = a.kategoriId)
indeholder alle søjler fra de tre tabeller. Nogle søjler er der flere gange med
samme indhold, fx tblAdmin.AdminId og tblAdgang.brugerId. Dog(!) hvis brugeren
ikke var i tblAdgang, så indeholder tblAdgang.brugerId værdien Null, mens
tblAdmin.AdminId indeholder brugerens id.
4. Det er det er hvis den ikke var i tblAdgang at den så indeholder Null vi
bruger i SELECT-delen:
Not IsNull(a.brugerId) AS adgang
Hvis a.brugerId ikke er Null, så var den i tblAdgang, og derfor er der adgang.
Variablen 'adgang' bør vist indeholde True/False, men hvis man ser på det i
Access, så indeholder den -1 eller 0 hhv. -1 svarer til True og 0 til False.
5. Til sidst laves en sortering, så vi kan lave en flot liste :)
Så skal vi skrive det som en form med checkboxe:
While not ors.EOF
%>
Bruger: <%= ors("AdminUser") %> og
Kategori: <%= ors("TName") %>
<% If ors("adgang") Then %>
<input type="checkbox" name="adgang"
value="<%= ors("AdminId") %>$<%= ors("Type") %>" checked>
<% Else %>
<input type="checkbox" name="adgang"
value="<%= ors("AdminId") %>$<%= ors("Type") %>">
<% End If %>
<%
ors.MoveNext
WEnd
Den gør at alle checkboxe får en unik value (bestående af brugerId $
kategoriId), og derfor kan man på næste side indsætte de rettigheder det blev
valgt.
Først slettes alt gammelt information:
DELETE * FROM Adgang
og ny information indsættes:
For i = 1 To Request.Form("adgang").Count
adminId = Split(Request.Form("adgang")(i), "$")(0) ' måske skal der stå 1
typeId = Split(Request.Form("adgang")(i), "$")(1) ' måske skal der stå 2
sql = "INSERT INTO Adgang (brugerId, kategoriId) VALUES (" & _
adminId & "," & typeId & ")"
conn.execute(sql)
Next
Forhåbentlig kan det give dig et skub videre :)
mvh Torben
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Christian M. Nielsen (18-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 18-01-06 17:56 |
|
"Torben Brandt" <ukendt1000@hotmail.com> skrev i en meddelelse
news:<43cd8f3f$0$15790$14726298@news.sunsite.dk>...
> Nedenstående udtræk lister for hver bruger alle kategorierne og om der er
> adgang
> til den enkelte kategori for den enkelte bruger:
>
> SELECT
> b.AdminID, b.AdminUser, b.Type, b.TName
> Not IsNull(a.brugerId) AS adgang
> FROM
> (SELECT * FROM tblAdmin, tblMenuObjects) AS b
> LEFT JOIN
> tblAdgang a
> ON
> (b.AdminID = a.brugerId) AND (b.Type = a.kategoriId)
> ORDER BY
> b.AdminUser, b.Type
Det ser ud til at virke fint, Jeg har udviddet det lidt, så jeg kun får
listet én kategori og så kan afkrydse dem der må have lov til at se den
enkelte kategori. Det synes jeg er nemmere, end at have en komplet liste,
der pt. giver 60 linier. Jeg forventer at det vil stige en del, så snart jeg
har lavet dette færdigt.
SELECT b.AdminID, b.AdminUser, b.Type, b.MenuName_dk, CBool(Not
IsNull(a.brugerId)) AS adgang
FROM [SELECT * FROM tblAdmin, tblMenuObjects] AS b LEFT JOIN tblAdgang AS a
ON (b.Type = a.kategoriId) AND (b.AdminID = a.brugerId)
WHERE (((b.Type)=1)) '1 udskiftes dynamisk for hver kategori
ORDER BY b.AdminUser, b.Type;
> Så skal vi skrive det som en form med checkboxe:
>
> While not ors.EOF
> %>
> Bruger: <%= ors("AdminUser") %> og
> Kategori: <%= ors("TName") %>
> <% If ors("adgang") Then %>
> <input type="checkbox" name="adgang"
> value="<%= ors("AdminId") %>$<%= ors("Type") %>" checked>
> <% Else %>
> <input type="checkbox" name="adgang"
> value="<%= ors("AdminId") %>$<%= ors("Type") %>">
> <% End If %>
> <%
> ors.MoveNext
> WEnd
Jeg har lavet lidt om på listen, da det ikke længere er nødvendigt med
kategorinavn ud for hver bruger.
%>
Kategori: <%= oRsAllowedUsers("MenuName_dk") %>
<br>
<%While not oRsAllowedUsers.EOF %>
Bruger: <%= oRsAllowedUsers("AdminUser") %>
<% If oRsAllowedUsers("adgang") Then %>
<input type="checkbox" name="adgang"
value="<%= oRsAllowedUsers("AdminId") %>$<%= oRsAllowedUsers("Type") %>"
checked>
<% Else %>
<input type="checkbox" name="adgang"
value="<%= oRsAllowedUsers("AdminId") %>$<%= oRsAllowedUsers("Type") %>">
<% End If
oRsAllowedUsers.MoveNext
WEnd%>
> Den gør at alle checkboxe får en unik value (bestående af brugerId $
> kategoriId), og derfor kan man på næste side indsætte de rettigheder det
> blev
> valgt.
>
> Først slettes alt gammelt information:
>
> DELETE * FROM Adgang
>
> og ny information indsættes:
>
> For i = 1 To Request.Form("adgang").Count
> adminId = Split(Request.Form("adgang")(i), "$")(0) ' måske skal der stå 1
> typeId = Split(Request.Form("adgang")(i), "$")(1) ' måske skal der stå 2
> sql = "INSERT INTO Adgang (brugerId, kategoriId) VALUES (" & _
> adminId & "," & typeId & ")"
> conn.execute(sql)
> Next
Endnu ikke testet, men jeg tror der virker. Måske vil du forklare hvad der
sker? Det er nemlig nogle gode forklaringer du har givet tidligere.
> Forhåbentlig kan det give dig et skub videre :)
Ikke bare et skub, men et ordentligt los. Jeg er meget taknemmelig for den
hjælp som jeg har fået, uden hvilken jeg ikke var kommet i mål. Dertil er
mine kode færdigheder for ufuldstændige.
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Torben Brandt (22-01-2006)
| Kommentar Fra : Torben Brandt |
Dato : 22-01-06 01:19 |
|
Christian M. Nielsen wrote in dk.edb.internet.webdesign.serverside.asp:
> Torben Brandt skrev:
>
> > For i = 1 To Request.Form("adgang").Count
> > adminId = Split(Request.Form("adgang")(i), "$")(0) ' måske skal der stå 1
> > typeId = Split(Request.Form("adgang")(i), "$")(1) ' måske skal der stå 2
> > sql = "INSERT INTO Adgang (brugerId, kategoriId) VALUES (" & _
> > adminId & "," & typeId & ")"
> > conn.execute(sql)
> > Next
>
> Endnu ikke testet, men jeg tror der virker. Måske vil du forklare hvad der
> sker? Det er nemlig nogle gode forklaringer du har givet tidligere.
Det vil jeg da gerne - måske har du endda fundet ud af det med de svartider på
flere dage jeg har :)
1. Opsætningen med checkboxene gør at alle checkboxe har value der består af
brugerid$kategoriid, fx Anders$12. Alle disse checkboxe har unikke value. Deres
name er for dem alle identisk, og er sat til adgang.
2. Når en form bliver submittet så vil kun de afkrydsede checkboxe blive sendt
med, så når man gennemløber arrayet
Request.Form("adgang")
så får man alle de afkrydsede boxe, dvs dem der skal have adgang.
3. Når du har tilrettet det til kun at omhandle een kategori, så skal altså alt
i databasen (tabellen tblAdgang) om den kategori erstattes med de nye
adgangsrettigheder.
Vi sletter derfor alt tidligere:
DELETE * FROM tblAdgang WHERE kategoriID = [kategoriens id]
4. Kategoriens id kan enten sendes med i et hidden felt for sig, eller man kan
udnytte at den findes i de sendte boxe (husk at lave en undtagelse for hvis der
ikke er sendt noget!)
kategoriId = Split(Request.Form("adgang")(1), "$")(1)
Det skal læses sådan her:
4.1 Request.Form("adgang")(1) indeholder fx Anders$12
4.2 Split opdeler det i to strenge med $ som opdeler. Så fås et array med to
elementer.
4.3 ...)(1) tager 2. element i arrayet, hvilket er det efter $'et
4.4 Jeg ville nok vælge løsningen med at sende kategori med i et hidden felt,
for hvis man vil fjerne adgang for alle brugere, så vil man jo sende en form
hvor der ikke er afkrydset nogle.
5. Vi skal også indsætte de nye rettigheder. På samme måde fås brugerid:
brugerid = Split(Request.Form("adgang")(1), "$")(0)
og vi kan indsætte i databasen
INSERT INTO Adgang (brugerId, kategoriId) VALUES ([brugerid], [kategoriId])
mvh Torben
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Christian M. Nielsen (22-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 22-01-06 11:32 |
|
"Torben Brandt" <ukendt1000@hotmail.com> skrev i en meddelelse
news:43d2cf76$0$15787$14726298@news.sunsite.dk...
> Det vil jeg da gerne - måske har du endda fundet ud af det med de
> svartider på
> flere dage jeg har :)
Dine svartider er nu ikke så voldsomme, men jeg synes at det tager meget
lang tid for serveren at udføre denne sidste del
(INSERT INTO Adgang .............)
Fra at jeg trykker på submit knappen, til at handlingen er udført går der
4-5 sekunder, bør det ikke være hurtigere? Jeg har dog kun testet lokalt ind
til videre, på en gammel 1.3 P4, men det burde gå hurtigere? Resten forløber
smertefrit.
> DELETE * FROM tblAdgang WHERE kategoriID = [kategoriens id]
> 4. Kategoriens id kan enten sendes med i et hidden felt for sig, eller man
> kan
> udnytte at den findes i de sendte boxe (husk at lave en undtagelse for
> hvis der
> ikke er sendt noget!)
> 4.4 Jeg ville nok vælge løsningen med at sende kategori med i et hidden
> felt,
> for hvis man vil fjerne adgang for alle brugere, så vil man jo sende en
> form
> hvor der ikke er afkrydset nogle.
Jeg har allerede kategoriID med, da jeg også bruger samme form til at
redigere navnet på menuen.
Mange tak for hjælpen.
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Christian M. Nielsen (22-01-2006)
| Kommentar Fra : Christian M. Nielsen |
Dato : 22-01-06 12:52 |
|
"Christian M. Nielsen" <look.for.it@my.webpage> skrev i en meddelelse
news:43d35f0e$0$78279$157c6196@dreader1.cybercity.dk...
> Dine svartider er nu ikke så voldsomme, men jeg synes at det tager meget
> lang tid for serveren at udføre denne sidste del
> (INSERT INTO Adgang .............)
> Fra at jeg trykker på submit knappen, til at handlingen er udført går der
> 4-5 sekunder, bør det ikke være hurtigere? Jeg har dog kun testet lokalt
> ind til videre, på en gammel 1.3 P4, men det burde gå hurtigere? Resten
> forløber smertefrit.
Jeg har indsat en ekstra linie som gjorde udfaldet (lige før next):
For i = 1 To Request.Form("adgang").Count
AdgangadminId = Split(Request.Form("adgang")(i), "$")(0)
AdgangtypeId = Split(Request.Form("adgang")(i), "$")(1)
strSQLAdgang = "INSERT INTO tblAdgang (brugerId, kategoriId) VALUES (" &
AdgangadminId & "," & AdgangtypeId & ")"
set oRsAdgang = OpenRecordset(strSQLAdgang)
set oRsAdgang = NOTHING '<- ny linie
Next
--
Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
The scary thing about looking for truth is that you might find it.
| |
Jørn Andersen (22-01-2006)
| Kommentar Fra : Jørn Andersen |
Dato : 22-01-06 18:13 |
|
On Sun, 22 Jan 2006 12:51:53 +0100, "Christian M. Nielsen"
<look.for.it@my.webpage> wrote:
>"Christian M. Nielsen" <look.for.it@my.webpage> skrev i en meddelelse
>news:43d35f0e$0$78279$157c6196@dreader1.cybercity.dk...
>
>> Dine svartider er nu ikke så voldsomme, men jeg synes at det tager meget
>> lang tid for serveren at udføre denne sidste del
>> (INSERT INTO Adgang .............)
>> Fra at jeg trykker på submit knappen, til at handlingen er udført går der
>> 4-5 sekunder, bør det ikke være hurtigere? Jeg har dog kun testet lokalt
>> ind til videre, på en gammel 1.3 P4, men det burde gå hurtigere? Resten
>> forløber smertefrit.
>
>
>Jeg har indsat en ekstra linie som gjorde udfaldet (lige før next):
>
>For i = 1 To Request.Form("adgang").Count
> AdgangadminId = Split(Request.Form("adgang")(i), "$")(0)
> AdgangtypeId = Split(Request.Form("adgang")(i), "$")(1)
> strSQLAdgang = "INSERT INTO tblAdgang (brugerId, kategoriId) VALUES (" &
>AdgangadminId & "," & AdgangtypeId & ")"
> set oRsAdgang = OpenRecordset(strSQLAdgang)
> set oRsAdgang = NOTHING '<- ny linie
>Next
Vil den ikke være hurtigere, hvis du:
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strDsn
For i = 1 To Request.Form("adgang").Count
AdgangadminId = Split(Request.Form("adgang")(i), "$")(0)
AdgangtypeId = Split(Request.Form("adgang")(i), "$")(1)
strSQLAdgang = "INSERT INTO tblAdgang (brugerId, kategoriId) VALUES
(" & AdgangadminId & "," & AdgangtypeId & ")"
objConn.Execute(strSQLAdgang)
Next
objConn.Close
Set objConn = Nothing
-?
Så slipper du i hvert fald for at oprette og slet et recordset-object
i hvert gennemløb.
--
Jørn Andersen,
Brønshøj
| |
|
|