17. februar 2006 - 10:22Der er
51 kommentarer og 1 løsning
login form, der sender user id og andet date med.
Hej
jeg vil gerne lave en login funktion til mit c# program. Jeg har derfor lavet en tabel med user og password, samt en user rolle og et user id.
Jeg har der ud over lavet en login form, som er det første man ser når man starter programmet. jeg vil så gerne ha så man logger ind, og hvis man angiver det rigtige user og password, logger den en ind, og sender user id og user rolle med, hvordan gøres dette?
går ud fra user id og rolle skal sendes med som en string, af en form. men hvordan gøres dette?
I constructoren til den form du vil åbne laver du input parametrene id og rolle. I form klassen laver du så et par globale variabler der holder på de input der er med i constructoren.
F.eks:
I loginformen:
//Hvis brugeren er logget korrekt på skal den nye form kaldes og vises
Desuden kan du nok ikke lukke loginformen uden at programmet exiter, da den jo er din startform. ved succesfuld login kan du derfor bare skrive this.Hide(); i loginformen. Når du så exiter programmet fra en anden form skal du have fat i en instans af den loginform du bruger. Dette kan du opnå ved at implementere et singleton pattern. Et singleton pattern virker på den måde at der kun oprettes en instans af formen. Når du vil lukke programmet fra en anden form skal du jo tilgå den aktuelle loginform, og ikke en ny instans af den. Det virker ved at man laver constructoren privat istedet for public. Indsæt følgende kode i loginformen:
public class Loginform : System.Windows.Forms.Form { // // Singleton Pattern så loginformen kan styre til gangen til selve programmet. // private static Loginform instance;
Det er en god ide at lave loginformen for sig selv, og bruge en singleton som beskrevet. Prøv at implementere det i din kode. Du lærer meget ved det. Det kan også bruges i andre klasser som der kun skal arbejdes med en instans af. F.eks hvis du laver en cache som et array der holder på værdier eller objekter. Hvis andre klasser eller forme skulle bruge denne cache skulle de lave en instans af klassen hver gang samt fylde cachen. Med et singleton pattern er det altid den samme instans af klassen der returneres, derfor skal cache arrayet også kun fyldes en gang.
Ok tak :) så laver jeg bare en login form. har dog lige ekstra spørgsmål så som jeg håber du ik har noget imod at svare på hvis du kan.
kan man disable og aktivere tabpages? kan nemelig ik rigtig få den til det.
angående din kode, er det bare mig eller tjekker den ik kun bruger? hvor sammenligner den om indholdet i user og password passer med user og password i dbén?
prøver lige at se om jeg kan få det singleton til at virke, lydder nemelig smart!
Den henter password ud fra databasen ved hjælp af den text der står i textbox1 (brugernavn). Den sammenligner så det returnerede fra databasen med textbox2 (password) hvis de matcher åbnes den nye form ellers skal du lave en label hvor der står det ikke matcher. ret enkelt men effektivt. Jeg tjekker lige om på det med tabpages jeg har et program jeg lavede for nyligt med tabs
Hmm jeg får bare: Error 1 No overload for method 'ShowTabPage' takes '2' arguments ved: ShowTabPage(tp, tabControl1.TabPages.Count);
gemmer og viser den her ikke bare alle "tabpages"? mente nemelg om det var muligt f.eks at hide tabpage2 og tabpage3 mens tabpage1 og tabpage4 sku ku ses. (håber det gav mere mening)
Du bør ikke gemme passwords i klartekst i databasen. Overvej at lade din login form sende en hash af password som sammenlignes med databasens gemte hashværdi.
Ups jeg glemte lige en metode.. Man skal selv implementere den funktionalitet. Det er ikke noget man kan standard. det virker som du beskriver. Den gemmer den tabpage du sender med som parameter når du kalder metoden, og tilsvarende for at vise den igen. Koden skulle have været:
private void HideTabPage(TabPage tp) { if (tabControl1.TabPages.Contains(tp)) tabControl1.TabPages.Remove(tp); }
Kalder du HideTabPage metoden fra den form der har tabpages? Det burde nu virke. HEr er et scenarie:
I constructoren til den form der åbnes bliver id og rolle initieret. Med en simpel if, eller switch kan du styre tab pages. Åbn design visning af formen og dobbelklik i det blå område øverst. Herefter laves der en metode i koden der fyres af når formen loader. Her kan du så tilgå id og rolle for at bestemme hvilke tabpages der skal være aktive. I følgende kode går vi ud fra at formen hedder TabForm:
Hvis det er enkelt bruger app med password på databasen er der da ikke andre der kan se dit password. Det er jo ikke tale om en netværks app så vidt jeg har forstået det. Man må da gå ud fra at det kun er admin der har adgang til den db
Min pointe er, at det er en uskik at gemme ting som passwords i klartekst. Det er måske overkill i denne konkrete situation; men hvorfor dog lave dårlig kode til at starte med?
det er kun admin, så har ik tænkt mig at bruge tid på lave det med koden. i det mindste betyder det at det er muliget at genfinde folks forsvundende passwords :)
angåden tabpages, jeg har bare smidt
private void HideTabPage(TabPage tp) { if (tabControl1.TabPages.Contains(tp)) tabControl1.TabPages.Remove(tp); }
Enig claus. Men hvad med den situation hvor du glemmer dit password? Jeg skal sige at jeg ikke har meget forstand på hash coding. Vi er ikke kommet så langt i undervisningen endnu :) (3.sem datamatiker) hehe Kender du nogen tutorials på området?
Så giver det ikke rigtig mening at det ikke virker hehe.. Jeg kopierede metoderne ind i formen og kaldte dem på samme måde som du har gjort. Skriver den samme fejl som du skrev tidligere?
clausc> har du så ret i. men nu er jeg ik lige frem speciel god til at kode.. simple ting tager lang tid osv.. men har du nogle tuts til det eller sådan?
arh oha hvor er jeg dum.. jeg kan sq da også bare poste hele koden.. oha.. sry indsæt det her så virker det:
private void InsertTabPage(TabPage tabpage, int index) { if (index < 0 || index > tabControl1.TabCount) throw new ArgumentException("Index out of Range."); tabControl1.TabPages.Add(tabpage); if (index < tabControl1.TabCount - 1) do { SwapTabPages(tabpage, (tabControl1.TabPages[tabControl1.TabPages.IndexOf(tabpage) - 1])); } while (tabControl1.TabPages.IndexOf(tabpage) != index); tabControl1.SelectedTab = tabpage; }
Sites hvor man kan få tilsendt et glemt password, har passwords liggende enten i klartekst eller noget der rent sikkerhedsmæssigt er det samme; dvs ikke noget jeg vil udlevere noget som helst sensitivt til.
Sites der IKKE kan oplyse om glemte passwords, tyder så på bedre data-sikkerhed. Og hverken admins eller hackers har andre muligheder end brute-force eller at oprette et nyt password (typisk med et hemmeligt spørgsmål/svar som man har angivet ved oprettelsen).
Kender ikke lige nogle tutorials.
PS: giv alle points til innercitydk; jeg har bare blandet mig :)
Hvorfor er der ikke en smily for rød i hovedet herinde hehe :)
private void SwapTabPages(TabPage tp1, TabPage tp2) { if (tabControl1.TabPages.Contains(tp1) == false || tabControl1.TabPages.Contains(tp2) == false) throw new ArgumentException("TabPages must be in the TabControls TabPageCollection.");
int Index1 = tabControl1.TabPages.IndexOf(tp1); int Index2 = tabControl1.TabPages.IndexOf(tp2); tabControl1.TabPages[Index1] = tp2; tabControl1.TabPages[Index2] = tp1;
private void ShowTabPage(TabPage tp , int index) { if (tabControl1.TabPages.Contains(tp)) return; InsertTabPage(tp, index); }
private void InsertTabPage(TabPage tabpage, int index) { if (index < 0 || index > tabControl1.TabCount) throw new ArgumentException("Index out of Range."); tabControl1.TabPages.Add(tabpage); if (index < tabControl1.TabCount - 1) do { SwapTabPages(tabpage, (tabControl1.TabPages[tabControl1.TabPages.IndexOf(tabpage) - 1])); } while (tabControl1.TabPages.IndexOf(tabpage) != index); tabControl1.SelectedTab = tabpage; }
private void SwapTabPages(TabPage tp1, TabPage tp2) { if (tabControl1.TabPages.Contains(tp1) == false || tabControl1.TabPages.Contains(tp2) == false) throw new ArgumentException("TabPages must be in the TabControls TabPageCollection.");
int Index1 = tabControl1.TabPages.IndexOf(tp1); int Index2 = tabControl1.TabPages.IndexOf(tp2); tabControl1.TabPages[Index1] = tp2; tabControl1.TabPages[Index2] = tp1;
Ok jeg har fået login til at virke ;) skal bare lige regne ud hvordan jeg får vist id og rolle på formen efter hvem der er logget ind, hvordan vil du gøre det hvis login var på samme form, som regen af programmet?
Brug parameters, så man ikke kan lave sql injection
Synes godt om
Ny brugerNybegynder
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.