14. april 2003 - 14:32Der er
100 kommentarer og 1 løsning
JAAS (java authentication and authorization service)
Findes der en forklarende og gennemgående tekst online, som man kan få adgang til? Problemet er, at jeg gerne vil implementere noget login i mit system (lavet i Java), og det skulle JAAS-teknologien (java authentication and authorization service) vist være god til. Men hvor og hvordan finder jeg ud af at bruge teknologien?
jo...:-)...men jeg synes nu, at det jeg kan finde der, er ret forvirende. Findes der ikke nogle dokumenter på dansk? Eller kan en person herinde fra forklare mig, hvordan JAAS virker?
Ja, det kan vi skam hurtigt blive enige om :-) Men der må da fidnes nogle engelske dokumenter så, som beskriver JAAS sådan nogenlunde, så det er til at forstå?
Men nogle eksempler ville garanteret sætte gang i forståelsen også...(?)
Det er en web-aplikation på TomCat. CLienterne til programet har adgang til en menu. Men det er ikke alle menupunkterne, som de skal have adgang til. Det kommer an på deres rettigheder. Menuen ligger på en index-side på serversiden, som clienten requester. Alt afhænging af hvem der logger in på systemet, har clienten mulighed for bestemte valg i denne menu. Jeg har tænkt mig at bruge denne menu, i stedet for at lave noget smart rettigheds-noget inde i Access. Jeg ved bare ikke, hvordan jeg skal gøre det...?
Indtil videre har jeg fundet ud af, at JAAS også henter indformationer i policy.tool-filen. Den fil er rimelig nem, at sætte op. Men hvordan får JAAS så adgang til filen, hvad giver det JAAS af muligheder og og hvordan kan JAAS håndhæve disse restriktioner?
arne_v >> nu er jeg måske lidt uvidene - men skal der så "meget" til for at teste om en given usr/pwd kombination er rigtig ???
Hvilke fordele kan JAAS yde...
I min naivitet kunne jeg jo finde på at skrive public static boolean( String usr, String pwd ) { return ( ("arne").equals(usr) && ("rigtig").equals(pwd) ); }
Såå... For en, som ikke kender JAAS -- hvilke fordele ville jeg have ved at bruge JAAS til styre login - og hvilke situationer ville det _ikke_ være overkill at bruge JAAS
JaasTest.java og TestCallbackHandler.java er API baseret.
TestAuthenticator.java er SPI baseret.
Fordi JAAS er en standard vil man kunne rette i JaasTest.cfg til at bruge en anden authenticator (f.ex. Windows eller Unix system login eller baseret på en database tabel) uden at skulle rette og recompile applikationen (JaasTest.java og TestCallbackHandler.java).
Tilsvarende kan en tredie parts komponent købt som binary only kalde denne her authenticator.
Fordi det er en en standard.
Det må være fordelen ved det.
Og når noget skal kunne bruges som standard så sætter man en masse kloge mennesker sammen om at finde ud af, hvad der er brug for. Og normalt så bliver resulatet rimeligt komplekst.
Men hvis du spørger mig om jeg ville bruge JAAS til at sikre en web-applikation, så ville svaret være: nej - ikke medmindre der var specielle forhold der gjorde det nødvendigt.
public class Test implements PrivilegedAction { public Object run() { AccessController.checkPermission(new TestPermission()); return null; } } TestPermission.java -------------------
package jaastest;
import java.security.BasicPermission;
public class TestPermission extends BasicPermission { public TestPermission() { super("TestPermission"); } } TestPrincipal.java ------------------
package jaastest;
import java.security.Principal;
public class TestPrincipal implements Principal { private String name; public TestPrincipal(String name) { this.name = name; } public boolean equals(Object another) { return name.equals((String)another); } public String toString() { return "*"; } public String getName() { return name; } } JaasTest.cfg ------------
Det ser da godt ud, med al denne gennemgang :-) Men hvad mener du med dit sidste spørgsmål (09:01:43) ?
Nu skrev du jo, at du ikke ville benytte JAAS til login, hvis du kunne undgå det. Men er en ganske almindelig tabel, som man går ind og checker loginnavn og password i, så tilstrækkelig?
det første eksempel du gav, synes jeg godt, at jeg kan finde rundt i. Men det sidste her giver mig lidt problemer. (?)
Hvad er forskellen på/hvad bruges de til (hvad gør filerne helt præcist): TestCallbackHandler.java TestAuthenticator.java TestPrincipal.java
Jo, men har du skrevet nogle eksempler på #A og #B herinde?
Det eneste jeg har undersøgt er, at man kunne lave en almindelig databasetabel, hvor der både var loginnavn og passowrd i. Så kunne man fyre nogle SQL's afsted til tabellen. Og hvis de 2 felter i den aktuelle record passede overens med inputtet i SQL'en, så kunne man loges ind - eller var der fejl (ved exception).
#A er ligeud af landevejen. Du laver en HTML/JSP side med en form, når brugeren submitter så verificerer du username/password, lukker ham ind til siderne eller ej og gemmer information i hans session om username så alle sider kan checke om han er logget ind og hvem han er.
okay - begge muligheder lyder jo atraktive. Meeen...det er vel ikke noget, som du eventuel kan komme med et lille eksempel på? Det ville jeg i hvert fald påskønne. Bare et simpelt et - men dog gerne, så flere forskellige JSP-sider bliver kaldt efter hinanden, hvor brugeren stadig er logged in?
Når jeg prøver, at benytte den JaasTest-fil dér, ved hjælp af denne kommando: C:\>-Djava.security.auth.login.config="C:/JAAStest/Authentification/JaasTest.cfg"
så skriver den følgende ud:
C:\>-Djava.security.auth.login.config="C:/JAAStest/Authentification/JaasTest.cfg " '-Djava.security.auth.login.config' is not recognized as an internal or external command, operable program or batch file.
hvad betyder dette? At jeg ikke har den rigtige version af JDK installeret? Eller at jeg ikke har tilmeldt den rigtige fil i noget lign. classpath-agtigt noget?
java.lang.SecurityException: Unable to locate a login configuration at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:97) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:274) at java.lang.Class.newInstance0(Class.java:306) at java.lang.Class.newInstance(Class.java:259) at javax.security.auth.login.Configuration$3.run(Configuration.java:221) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.login.Configuration.getConfiguration(Configuration.java:215) at javax.security.auth.login.LoginContext$1.run(LoginContext.java:170) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.login.LoginContext.init(LoginContext.java:167) at javax.security.auth.login.LoginContext.<init>(LoginContext.java:404) at Authentification.JaasTest.test(JaasTest.java:9) at Authentification.JaasTest.main(JaasTest.java:17) Caused by: java.io.IOException: Unable to locate a login configuration at com.sun.security.auth.login.ConfigFile.init(ConfigFile.java:206) at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:95) ... 15 more Exception in thread "main"
Ja, det er rigtigt - selvfølgelig er det med Java i begyndelsen... Men når jeg skriver det, så skriver den:
C:\>java -Djava.security.auth.login.config="C:/JAAStest/Authentification/JaasTes t.cfg" Usage: java [-options] class [args...] (to execute a class) or java -jar [-options] jarfile [args...] (to execute a jar file)
where options include: -client to select the "client" VM -server to select the "server" VM -hotspot is a synonym for the "client" VM [deprecated] The default VM is client.
-cp -classpath <directories and zip/jar files separated by ;> set search path for application classes and resources -D<name>=<value> set a system property -verbose[:class|gc|jni] enable verbose output -version print product version and exit -showversion print product version and continue -? -help print this help message -X print help on non-standard options -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] enable assertions -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] disable assertions -esa | -enablesystemassertions enable system assertions -dsa | -disablesystemassertions disable system assertions
I dit indlæg fra 13:54:49 ... skal man så skrive "jaastest.JaasTest" efter den første linie? Altså linien med "java -Djava.security.auth.login.config="C:/JAAStest/Authentification/JaasTest.cfg"...?
C:\>java -Djava.security.auth.login.config=JaasTest.cfg -Djava.security.manager -Djava.security.policy=JaasTest.policy -classpath C:\JAAStest Authentification. JaasTest Exception in thread "main" java.security.AccessControlException: access denied ( javax.security.auth.AuthPermission createLoginContext.JaasTest) at java.security.AccessControlContext.checkPermission(AccessControlConte xt.java:270) at java.security.AccessController.checkPermission(AccessController.java: 401) at java.lang.SecurityManager.checkPermission(SecurityManager.java:542) at javax.security.auth.login.LoginContext.init(LoginContext.java:157) at javax.security.auth.login.LoginContext.<init>(LoginContext.java:404) at Authentification.JaasTest.test(JaasTest.java:9) at Authentification.JaasTest.main(JaasTest.java:17)
C:\>
Det fortæller vel, at jeg ikke har rettigheder til at køre filen?
jo, men dette er så ikke JAAS (?). JAAS er vel også nemt, da men "bare" skal override nogle interfaces. Der findes jo metoder til det hele. Det kan være lidt mere besværligt, at finde rundt i...men det er jo det, som jeg søger hjælp til her ;-)
public class Test implements PrivilegedAction { public Object run() { AccessController.checkPermission(new TestPermission()); return null; } } JaasTest -------- package jaastest;
public class JaasTest { private static boolean test(String name, String password) { try { LoginContext lc = new LoginContext("JaasTest", new TestCallbackHandler(name, password)); lc.login(); lc.logout(); return true; } catch (LoginException ex) { return false; } } private static void test2(String name, String password) { try { LoginContext lc = new LoginContext("JaasTest", new TestCallbackHandler(name, password)); lc.login(); Subject me = lc.getSubject(); Subject.doAsPrivileged(me, new Test(), null); System.out.println("access for " + name); lc.logout(); return; } catch (AccessControlException ex) { System.out.println("no access for " + name); } catch (LoginException ex) { ex.printStackTrace(); } } public static void main(String[] args) { System.out.println(test("arne", "forkert")); System.out.println(test("arne", "rigtig")); System.out.println(test("notarne", "rigtig")); System.out.println(test(null, null)); test2("arne", "rigtig"); test2("system", "rigtig"); } }
så skriver den: java.lang.SecurityException: Unable to locate a login configuration at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:97) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:274) at java.lang.Class.newInstance0(Class.java:306) at java.lang.Class.newInstance(Class.java:259) at javax.security.auth.login.Configuration$3.run(Configuration.java:221) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.login.Configuration.getConfiguration(Configuration.java:215) at javax.security.auth.login.LoginContext$1.run(LoginContext.java:170) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.login.LoginContext.init(LoginContext.java:167) at javax.security.auth.login.LoginContext.<init>(LoginContext.java:404) at jaastest.JaasTest.test(JaasTest.java:12) at jaastest.JaasTest.main(JaasTest.java:36) Caused by: java.io.IOException: Unable to locate a login configuration at com.sun.security.auth.login.ConfigFile.init(ConfigFile.java:206) at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:95) ... 15 more Exception in thread "main"
HEY - nu fik jeg eksemplet fra 17:32:28 til at fungere. Ja, det vil sige den kan da finde filen. Men uanset om jeg skriver "Arne - Arne" eller "System - System", så viser den login-failedsiden?
Hej Arne, tak for en god gennemgang af java authentication ;) Jeg bruger selv min egen lille login bean der gemmer info i session, og laver et tjek øverst i hver jsp fil. Jeg bruger dog også lidt constraints så man kan udelukke folk fra at se non-jsp filer såsom billeder og statiske xml filer.. Pt. er min metode at jeg bruger en dispatcher på "/" niveau som fanger alle request til applikationen.. dette er nok ikke det smarteste hvis man vil bruge en web server til at serve non-jsp filer... jeg vil som std. bruge et apache Httpserver + Tomcat..
p.s. det er vigtigt for min applikation at den dynamisk kan oprette brugere, og ændre deres constraints til et vidst niveau.
De filer som du ikke vil have folk skal kunne requeste kan du jo bare smide under WEB-INF.
Jeg er iøvrigt ikke helt klar over om det var et spørgsmål !?
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.