07. juni 2005 - 18:05Der er
14 kommentarer og 1 løsning
Opbygning af brugeradministration
Hvis man nu vil lave et administrationssystem hvor der kan være flere redaktører med hvert deres login, hvordan sikre man sig så, at bruger nr. 2 ikke får mulighed for at åbne et dokument som bruger nr. 1 har åben ?
Ligeledes, hvis bruger nr. 1 ikke logger sig ordentlig af men blot lukker browseren, så skal evt. dokumenter som denne bruger har haft åben jo være tilgængelige for andre ?
Jeg er interesseret i løsningsforslag, henvisninger til tutorials og lign.
Bruger Access database
Hvis jeg ikke lige svarer på evt. indlæg ret hurtigt er det fordi eksperten ikke formår at sende mails i øjeblikket (igen)
Når det foregår via Internettet kan du aldrig lave en perfekt løsning på denne slags problemstillinger; Når en bruger har hentet en side så er forbindelsen jo afbrudt totalt.
Det næstbedste:
1) Du styre det via en passende tabel med minimum følgende oplysninger:
DokumentID, BrugerID, UdtjekningsTidspunkt
Denne tabel angiver hvilke dokumenter der i øjeblikket er "tjekket ud", af hvem og hvornår dette skete.
2) Når en bruger vil redigere et dokument, skal hun først tjekke det ud af systemet:
2a) Enten optræder dokumentet ikke allerede i tabellen, og så før brugeren lov til at få dokumentet uden videre. Samtidigt oprettes der en post i tabellen med de relevante oplyninger.
2b) Hvis dokumentet allerede optræder i tabellen som tjekket ud så advares brugeren. Brugeren får nu mulighed for at vælge at stoppe med sit forehavende, eller at fortsætte alligevel under eget ansvar (dette kan man selvfølgeligt vælge at nægte). Hvis brugeren vælger det sidste, så skrives der endnu en post i tabellen.
3) Når en bruger er færdig med at redigere et dokument, skal hun tjekke det ind igen:
3a) Hvis der står i tabellen at den pågældende bruger har tjekket netop dette dokument ud, og der vel at mærke ikke er nogen tilsvarende poster for andre brugere, så sker dette uden videre. Posten slettes derefter for at indikere at dokumentet ikke mere er tjekket ud.
3b) Hvis der imidlertid er andre poster på det pågældende dokument så advares brugeren om dette. Brugeren kan nu vælge at stoppe med sit forehavende, eller at fortsætte alligevel under eget ansvar (også dette kan man selvfølgeligt vælge at nægte). Hvis brugeren vælger det sidste, så slettes posten fra tavellen.
3c) Hvis der ikke er en post for det pågældende dokument, så advares brugeren om dette. Brugeren kan så vælge at fortsætte eller ej (eller man kan nægte dette).
4) Der skal endvidere være et administrations system sådan at en super-admin kan slette rækker i tabellen. Måske er der slet ikke sådan en super, og så et det bare brugerne som har adgang til dette.
5) Brugerne skal også have lov til at slette rækker fra tabellen som svare til et dokument de tidligere har tjekket ud. Dette svare til at de fortryder udtjekningen.
Ovenstående system er primært tænkt til at brugerne er ansvarlige individer som ikke er ude på at ødelægge noget for de andre brugere af systemet. De skal m.a.o. bare advares, hvis de er ved at gøre sådan noget.
Problemet er at din session jo sagtens kan time ud af andre årsager end hvis brugeren logger af eller slukker sin browser. Det vil ikke være så smart at brugeren mister sine ændringer hvis det sker.
Ja jeg kan godt se at sessions godt kan time ud, men omvendt kan der jo ikke ske andet, end at risikoen for at en anden bruger redigere samme dokument opstår. Bruger1 vil jo ikke som sådan blive smidt af, blot vil dokumentet stå som ledigt.
Hvor stor vil du umiddelbart tro risikoen er for, at en session bliver smidt midt i det hele hvis man samtidig sætter en session timeout på f.eks. 60 min. ?
Brugeren er logget ind med cookies, vil det også fjerne evt. cookies hvis sessionen forsvinder, for så er der helt klart et problem ?
Sessions bliver ikke som sådan brugt til noget, alle loginoplysninger ligger i cookies
Det er muligt at mit eksempel ligner dit, men hvad vil der ske, hvis en bruger i dit eksempel ikke logger rigtigt af men blot lukker browseren (jeg har lidt svært ved at gennemskue det) ?
Nu ved jeg jo ikke rigtigt noget om hvilken type dokumenter vi her snakker om. Er det f.eks. Word-dokumenter eller er det redigering direkte på selve hjemmesiden? Er det store dokumenter?
Der findes en JavaScript komando der hedder onleave, dvs. du lave det sådan at når en bruger lukker browseren eller forlader siden, så redirectes til en sider der logger af.
Det bruges ti i forbindelse med reklamer.
Jeg er desværre ikke særlig god til js så jeg kan ikke lave den for dig, men du kunne prøve at lægge den ind under js kategorien.
Alt der på en eller anden måde afhænger af at brugeren opføre sig "pænt" bør undgås. Systemet skulle jo netop være hårdført overfor grimme scenarioer. Man bør derfor heller ikke basere sig (alt for meget) på at onleave udføres.
nielle >> jeg ved godt jeg skriver dokumenter, men det er et onlinesystem beregnet til vedligeholdelse af hjemmesider, altså en "normal" tekst, af forskellig størrelse, hentet fra en database.
diggers >> tror ikke lige det vil egne sig til det her formål - virker måske endnu mindre sikkert end løsningen med sessions.
Ok, det er altså totalt umuligt at forestille sig at det er muligt at redigere dokumenterne offline. :^)
Når en bruger vil redigere et dokument starter hun vel med at klikke på et link eller noget tilsvarende. Derefter (hvis hun altså får lov) kommer dokumentet frem i redigerings-mode på en ny html-side. Der kan være forskellige måder dette gøres på: i et textarea, i en ActiveX komponent eller muligvis via noget htc. Den eksakte måde er egentlig ligegyldig - det er alle samme tilfælde hvor at selve dokumentet ligger "indlejret" på en almindelig html-side, hvor der sagtens kan lægges andre ting (f.eks. en submit knap sådan at brugeren kan gemme dokumentet).
En af de andre ting som kunne ligge på siden kunne så være en lille iframe som ligger og reloader sig selv med jævne mellemrum. I det nedenstående som PHP, men det kunne lige så godt være ASP eller noget andet for den sags skyld.
Iframen indeholder denne kode:
<iframe src="keepalive.php" width="1px" height="1px">Denne browser understøtter ikke iframe – opdater til en som gør.</iframe>
Denne genloader sig selv med en frekvens på 5 sekunder (med en irriterende lille klik-lyd til). Du kan nok med fordel sætte denne op til 60 eller måske til 300 sekunder.
Metoden kræver dog at brugeren bruger en relativ ny browser for at være understøttet.
Med det ovenstående har du en metode til at vurdere om brugeren stadig er i gang med at redigere på dokumentet. For hvert klik bliver keepalive.php kaldt. Du kan derfor inkludere noget kode i filen som opdatere i din database.
Databasen skal stadig indeholde en tabel, som denne:
DokumentID, BrugerID, SenesteKlikTidspunkt
Når brugeren starter med at åbne dokumentet skrives der en række i tabellen.
Hver gang keepalive.php kaldes opdateres denne række. Du skal nok tilføje DokumentID og BrugerID id’erne til de relevante URL’s for at dette kan lade sig gøre, eller du kan hente dem i din session eller via en cookie.
Hvis en ny bruger beder om at måtte redigere dokumentet, slås der først på i tabellen. Hvis der ligger en post i tabellen på det dokument, så tjekkes tidspunktet i SenesteKlikTidspunkt. Hvis dette tidspunkt er alt for gammelt i forhold til din keepalive-frekvens så tillades redigeringen, ellers ikke.
Der er egentlig ingen speciel grund til at slette rækken når brugeren er færdig med at redigere dokumentet. Tiden går jo, og på et eller andet tidspunkt så vil låsen automatisk time ud.
Okay, nu tror jeg lige jeg skal bruge lidt tid på at sætte mig ind i alt det her og teste nogle ting af, så hvis du lægger et svar nielle, så får du pointene som tak for en brugbar dialog.
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.