Hi There, im a new bee to Jboss and JAAS as well
i tried to implement soem thing on jboss with jaas like this 1) a Login Page popup to teh user asking dor user id & password 2) After he clicks on login i thught of validating that using JAAS 3) If login is returned succesful i though of putting the subject in session for my future actions on th applications im using jsf 1.2 with richfaces Jboss 5.0 GA Here is what i did 1) I had created a configuration file like this nomination_authenticator.config | | /** Login Configuration for the JAAS Sample Application **/ | | NominationSystem { | com.security.login.SecurityLoginModule required debug=true; | }; | | 2) is one of my startup filter in my init i did this | | System.setProperty("-Djava.security.auth.login.config", | "nomination_authenticator.config | "); | | nomination_authenticator.config is available in my classpath. 3) i wrote a Autheticator in which a method will be called from my managed bean after collecting the user id and password which usre provides on screen | | package com.authentication; | | import java.io.IOException; | | import javax.security.auth.callback.Callback; | import javax.security.auth.callback.CallbackHandler; | import javax.security.auth.callback.NameCallback; | import javax.security.auth.callback.PasswordCallback; | import javax.security.auth.callback.UnsupportedCallbackException; | import javax.security.auth.login.LoginContext; | import javax.security.auth.login.LoginException; | | import com.logger.NominationLogger; | | public class Authenticator { | | | public static boolean AuthenticateUser(String userid, String password) | throws Exception { | LoginContext lc = null; | | try { | lc = new LoginContext("NominationSystem", | new AuthenticatorCallbackHandler(userid, password)); | } catch (LoginException le) { | NominationLogger.error("Cannot create LoginContext. " | + le.getMessage()); | throw le; | } catch (SecurityException se) { | NominationLogger.error("Cannot create LoginContext. " | + se.getMessage()); | throw se; | } | | try { | lc.login(); | } catch (LoginException e) { | NominationLogger.error("Login Error" + e.getMessage()); | throw e; | } | | return false; | } | } | | class AuthenticatorCallbackHandler implements CallbackHandler { | private String userId = null; | private String password = null; | | public AuthenticatorCallbackHandler(String userId, String password) { | this.userId = userId; | this.password = password; | } | | public void handle(Callback[] callbacks) throws IOException, | UnsupportedCallbackException { | for (int i = 0; i < callbacks.length; i++) { | if (callbacks | instanceof NameCallback) { | NameCallback nc = (NameCallback) callbacks | ; | nc.setName(userId); | | } else if (callbacks | instanceof PasswordCallback) { | PasswordCallback pc = (PasswordCallback) callbacks | ; | pc.setPassword(getPasswordAsCharArray(password)); | } else { | throw new UnsupportedCallbackException(callbacks | , | "Unrecognized Callback"); | } | } | } | | private char[] getPasswordAsCharArray(String password) { | char[] charArrPassword = null; | charArrPassword = new char[password.length()]; | for (int i = 0; i < password.length(); i++) | charArrPassword | = password.charAt(i); | return charArrPassword; | } | } | bold font method will be called from my managed bean with user id and password. and my Login module is this | | package com.security.login; | | import java.util.Map; | | import javax.security.auth.Subject; | import javax.security.auth.callback.Callback; | import javax.security.auth.callback.CallbackHandler; | import javax.security.auth.callback.NameCallback; | import javax.security.auth.callback.PasswordCallback; | import javax.security.auth.callback.UnsupportedCallbackException; | import javax.security.auth.login.FailedLoginException; | import javax.security.auth.login.LoginException; | | import com.logger.NominationLogger; | import com.managedbeans.NominationBaseBean; | | public class SecurityLoginModule implements javax.security.auth.spi.LoginModule { | // initial state | private Subject subject; | private CallbackHandler callbackHandler; | private Map sharedState; | private Map options; | // configurable option | private boolean debug = false; | // the authentication status | private boolean succeeded = false; | private boolean commitSucceeded = false; | // username and password | private String userId; | private String password; | private String role; | private String name; | // principle object | private NominationPrinciple nominationPrincipal; | | public void initialize(Subject subject, CallbackHandler callbackHandler, | Map sharedState, Map options) { | this.subject = subject; | this.callbackHandler = callbackHandler; | this.sharedState = sharedState; | this.options = options; | // initialize any configured options | debug = "true".equalsIgnoreCase((String) options.get("debug")); | } | | public boolean login() throws LoginException { | // prompt for a user name and password | if (callbackHandler == null) | throw new LoginException("Error: no CallbackHandler available " | + "to garner authentication information from the user"); | | Callback[] callbacks = new Callback[2]; | callbacks[0] = new NameCallback("user name: "); | callbacks[1] = new PasswordCallback("password: ", false); | | try { | callbackHandler.handle(callbacks); | userId = ((NameCallback) callbacks[0]).getName(); | char[] tmpPassword = ((PasswordCallback) callbacks[1]) | .getPassword(); | password = getPasswordAsString(tmpPassword); | ((PasswordCallback) callbacks[1]).clearPassword(); | } catch (java.io.IOException ioe) { | throw new LoginException(ioe.toString()); | } catch (UnsupportedCallbackException uce) { | throw new LoginException("Error: " + uce.getCallback().toString() | + " not available to garner authentication information " | + "from the user"); | } | // print debugging information | if (debug) { | NominationLogger.debug("user id: " + userId); | NominationLogger.debug("Password: " + password); | } | // verify the username/password | boolean usernameCorrect = false; | boolean passwordCorrect = false; | // Hit db here with user id and password and get the details | // assign role to role variable | if (userId.equals("testUser")) | usernameCorrect = true; | if (usernameCorrect && password.equals("testPassword")) { | // authentication succeeded!!! | passwordCorrect = true; | if (debug) | NominationLogger.debug("authentication succeeded"); | // seeting some test role | role = "testRole"; | // setting test name | name = "Shivaji"; | succeeded = true; | return true; | } else { | // authentication failed -- clean out state | if (debug) | NominationLogger.debug("authentication failed"); | succeeded = false; | userId = null; | password = null; | throw new FailedLoginException("Invalid login"); | } | } | | public boolean commit() throws LoginException { | | if (succeeded == false) { | return false; | } else { | nominationPrincipal = new NominationPrinciple(name, role, userId); | if (!subject.getPrincipals().contains(nominationPrincipal)) | subject.getPrincipals().add(nominationPrincipal); | | if (debug) { | NominationLogger.debug("added SamplePrincipal to Subject"); | } | | // setting subject to session | new NominationBaseBean().getNominationSessionBean().setSubject( | subject); | | // in any case, clean out state | userId = null; | password = null; | name = null; | role = null; | | commitSucceeded = true; | return true; | } | } | | public boolean abort() throws LoginException { | | if (succeeded == false) { | return false; | } else if (succeeded == true && commitSucceeded == false) { | // login succeeded but overall authentication failed | succeeded = false; | userId = null; | role = null; | password = null; | name = null; | nominationPrincipal = null; | } else { | // overall authentication succeeded and commit succeeded, | // but someone else's commit failed | logout(); | } | return true; | } | | public boolean logout() throws LoginException { | subject.getPrincipals().remove(nominationPrincipal); | succeeded = false; | succeeded = commitSucceeded; | userId = null; | role = null; | password = null; | name = null; | nominationPrincipal = null; | return true; | } | | private String getPasswordAsString(char[] password) { | StringBuffer stringPassword = new StringBuffer(); | for (int i = 0; i < password.length; i++) | stringPassword.append("" + password | ); | return stringPassword.toString(); | } | } | | in my web.xml i added this | | <security-constraint> | <!-- | A collection of protected resources along with the access mechanism | --> | <web-resource-collection> | <web-resource-name>Restricted to Secure role</web-resource-name> | <description>Declarative security</description> | <url-pattern>/*</url-pattern> | <http-method>HEAD</http-method> | <http-method>GET</http-method> | <http-method>POST</http-method> | <http-method>PUT</http-method> | <http-method>DELETE</http-method> | </web-resource-collection> | <!-- The list of roles that can access the resource. --> | <auth-constraint> | <role-name>User</role-name> | <role-name>Approver</role-name> | <role-name>Account_L_D</role-name> | <role-name>L_D</role-name> | </auth-constraint> | </security-constraint> | in my web-inf i added jboss-web.xml | | <?xml version="1.0" encoding="UTF-8"?> | <jboss-web> | <security-domain>java:/jaas/NominationSecurity</security-domain> | </jboss-web> | | i added thsi in my login-config.xml | <application-policy name="NominationSecurity"> | <authentication> | <login-module code="com.security.login.SecurityLoginModule" | flag="required"> | <module-option name="usersProperties">props/nominationSystem-users.properties</module-option> | </login-module> | </authentication> | </application-policy> | | this is all what i did for my application but when i tried to access the login page it giving me access denied im sure that i did something absured pls correct me if i. please help me in understanding and making my wish working... Thanks a lot in advance View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4233269#4233269 Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4233269 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user