Bonjour
j'ai un probléme dans l'accés a mon ejb, lorsque je veux acceder a cette ejb par user et mot de passe, dans le tutoriel ils ont signale que pour l'authentification ont utilise JAAS et c'est ce que j'ai fait mais j'ai pas reussi :
voici mon code :
le code de EJB est:
mon code au niveau client est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 @RolesAllowed({"Admin"}) public class TestBean implements TestRemote { @Resource SessionContext ctx; public TestBean() { } // AnyOne can call this method @PermitAll public int add(int a, int b) { return a+b; } // manager can only access to this method @RolesAllowed({"manager"}) public int sous(int a, int b) { //TODO implement sous return 0; } // no one can call this method except the administrators public String callerRetourne() { return ctx.getCallerPrincipal().getName(); } // no one can access to this method @DenyAll public int prod(int a, int b) { return a*b; } }
ModulePassword.JAVA le login module:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public class Main { public Main() { } public static void main(String[] args) { // try{ Subject sub=new Subject(); LoginContext login=new LoginContext("test",sub,new CallBackHandler()); login.login(); Subject.doAs(sub,new Test()); } catch(LoginException e){ System.err.println("Erreur dans login Context"+e.getMessage()); } } }
Le code de CallbackHandler:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 public class PasswordLoginModule implements LoginModule{ private Subject subject; private String username; private char[] password={'i','n','f','o'}; private CallbackHandler call; // Constructeur public PasswordLoginModule() { } // Initialiuse public void initialize(Subject sub,CallbackHandler call,Map sharedState,Map options){ subject=sub; this.call=call; } // Login public boolean login() throws LoginException{ /* if(call==null){ throw new LoginException("erreur dans le callbackhandler null"); } Callback[] callback=new Callback[2]; callback[0]=new NameCallback("userName s'il vous plait:"); callback[1]=new PasswordCallback("Password :",false); try{ call.handle(callback); username=((NameCallback)callback[0]).getName(); if(username==null){ throw new LoginException("username invalide"); } char[] tmpPassword=((PasswordCallback)callback[1]).getPassword(); if(tmpPassword==null){ tmpPassword=new char[0]; } password=new char[tmpPassword.length]; System.arraycopy(tmpPassword,0,password,0,tmpPassword.length); ((PasswordCallback)callback[1]).clearPassword(); javax.swing.JOptionPane.showMessageDialog(null,"fin de login in???"); }catch(IOException ioe){ System.err.println("erreur dans le entrée sortie ="+ioe.getMessage()); }catch(UnsupportedCallbackException e){ System.err.println("erreur le support de callback ="+e.getMessage()); }*/ this.username="simo"; return true; } // commit public boolean commit(){ //throws LoginException{ javax.swing.JOptionPane.showMessageDialog(null,"username=???"+username); javax.swing.JOptionPane.showMessageDialog(null,"username=???"+password); PasswordCredential pass=new PasswordCredential(username,password); subject.getPrivateCredentials().add(pass); username=null; password=null; javax.swing.JOptionPane.showMessageDialog(null,"commit???"); return true; } // Abort public boolean abort() throws LoginException{ javax.swing.JOptionPane.showMessageDialog(null,"abort???"); return true; } // logout public boolean logout() throws LoginException{ username=null; password=null; return true; } }
la classe qui permet l'accés au ejb :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public class CallBackHandler implements CallbackHandler{ public CallBackHandler() { } public void handle(Callback[] call) { for(int i=0;i<call.length;i++){ if(call[i] instanceof NameCallback){ NameCallback nc=(NameCallback)call[i]; String name="simo";//j'ai fixé le login nc.setName(name); }else if(call[i] instanceof PasswordCallback){ PasswordCallback pc=(PasswordCallback)call[i]; String pass="info"; pc.setPassword(pass.toCharArray()); }}}}
lors de l'execution, je recoit le message suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public class Test implements PrivilegedAction{ @EJB private static TestRemote testBean; public Test() { } public Object run(){ try{ Context ctx=new InitialContext(); javax.swing.JOptionPane.showMessageDialog(null,1); Object obj=ctx.lookup(TestRemote.class.getName()); javax.swing.JOptionPane.showMessageDialog(null,2); testBean=(TestRemote)javax.rmi.PortableRemoteObject.narrow(obj,TestRemote.class); javax.swing.JOptionPane.showMessageDialog(null,"la somme 2+4="+testBean.add(2,4)+"//La caller est="+testBean.callerRetourne()); }catch(NamingException e) { javax.swing.JOptionPane.showMessageDialog(null,"Vous n'avez le droit d'accerder a cette EJB"+e.getMessage()); } return null; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 6 août 2007 14:14:28 com.sun.enterprise.iiop.security.SecurityMechanismSelector getUsernameAndPassword GRAVE: IOP5023: Exception getting username and password java.lang.ClassCastException: javax.resource.spi.security.PasswordCredential cannot be cast to com.sun.enterprise.security.auth.login.PasswordCredential at com.sun.enterprise.iiop.security.SecurityMechanismSelector$2.run(SecurityMechanismSelector.java:877) at java.security.AccessController.doPrivileged(Native Method) at com.sun.enterprise.iiop.security.SecurityMechanismSelector.getUsernameAndPassword(SecurityMechanismSelector.java:875) at com.sun.enterprise.iiop.security.SecurityMechanismSelector.sendUsernameAndPassword(SecurityMechanismSelector.java:624) at com.sun.enterprise.iiop.security.SecurityMechanismSelector.getSecurityContextForAppClient(SecurityMechanismSelector.java:550) at com.sun.enterprise.iiop.security.SecurityMechanismSelector.selectSecurityContext(SecurityMechanismSelector.java:530) at com.sun.enterprise.iiop.security.SecurityServiceImpl.getSecurityContext(SecurityServiceImpl.java:102) at com.sun.enterprise.iiop.security.SecClientRequestInterceptor.send_request(SecClientRequestInterceptor.java:255) at com.sun.corba.ee.impl.interceptors.InterceptorInvoker.invokeClientInterceptorStartingPoint(InterceptorInvoker.java:227) at com.sun.corba.ee.impl.interceptors.PIHandlerImpl.invokeClientPIStartingPoint(PIHandlerImpl.java:322) at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:245) at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:156) at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:153) at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:119) at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:197) at com.sun.ejb.codegen._GenericEJBHome_Generated_DynamicStub.create(_GenericEJBHome_Generated_DynamicStub.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:342) at com.sun.ejb.containers.RemoteBusinessObjectFactory.getObjectInstance(RemoteBusinessObjectFactory.java:61) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304) at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:314) at javax.naming.InitialContext.lookup(InitialContext.java:392) at a.Test.run(Test.java:40) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:337) at a.Main.main(Main.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:232) at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:329) at com.sun.enterprise.appclient.Main.main(Main.java:180)
Partager