package auth.impl; import java.security.Principal; import java.util.ArrayList; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.mvc.Http; import play.mvc.Http.Context; import auth.impl.callbackHandlers.UsrPwdCallbackHandler; import auth.impl.callbacks.HttpUserPwdCallback; import auth.models.User; public abstract class BasicUserPwdAuthModule extends AbstractAuthModule { private static Logger logger = LoggerFactory.getLogger(BasicUserPwdAuthModule.class); /* * (non-Javadoc) * * @see auth.IAuthenticator#getCallbackHandler() */ @Override public CallbackHandler getCallbackHandler(Context ctx) { return new UsrPwdCallbackHandler(ctx); } /* * (non-Javadoc) * * @see javax.security.auth.spi.LoginModule#login() */ @Override public boolean login() throws LoginException { logger.debug("login()"); if (callbackHandler == null) { throw new LoginException("Error: no CallbackHandler available!"); } ArrayList<Callback> callbacks = new ArrayList<Callback>(); callbacks.add(new HttpUserPwdCallback()); try { Callback[] cb = new Callback[callbacks.size()]; callbackHandler.handle(callbacks.toArray(cb)); String username = ((HttpUserPwdCallback) cb[0]).username; String password = ((HttpUserPwdCallback) cb[0]).password; Http.Request req = ((HttpUserPwdCallback) cb[0]).getOriginalRequest(); pending = new ArrayList<Principal>(); User user = validateCredentials(username, password, req); if (user != null) { pending.add(user); return true; } } catch (Exception e) { logger.info("failed user validation.", e); } return false; } protected abstract User validateCredentials(String username, String password, Http.Request req) throws LoginException; }