Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSF + JAAS + Glassfish 
:(
    Опции темы
devalentino
Дата 17.2.2012, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



Здравствуйте. У меня вопрос по поводу авторизации средствами JAAS. Я написал свой модуль авторизации (MonopolyRealm, MonopolyLoginModule). Так же в другом проекте у меня есть класс, в котором я получаю логин и пароль из HTML формы (Player). Вопрос - как передать значения логина и пароля в мой модуль авторизации?
Модуль зарегистрирован в Glassfish 3.1.1. Теперь мне нужно чтобы мое приложение подхватило его при развертывании на сервере, и передало в него логин и пароль (в методе login класса Player)
Заранее спасибо

MonopolyRealm
Код

package net.monopolyclub.monopolylogin;

import java.util.Enumeration;
import java.util.Vector;
import java.sql.ResultSet;
import net.monopolyclub.monopolylogin.db.DBManager;
import net.monopolyclub.monopolylogin.db.DerbyDBManager;

import java.sql.SQLException;
import java.io.IOException;
import com.sun.enterprise.security.auth.realm.IASRealm;
import com.sun.enterprise.security.auth.realm.InvalidOperationException;
import com.sun.enterprise.security.auth.realm.NoSuchUserException;

public class MonopolyRealm extends IASRealm
{
    private DBManager dbManager;
    
    public MonopolyRealm () throws InvalidOperationException
    {
        super();
        dbManager = new DerbyDBManager();
        try
        {
            dbManager.initialize("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/****", "****", "****");
        }
        catch (SQLException e)
        {
            throw new InvalidOperationException(e.getMessage());
        }
        catch (IOException e)
        {
            throw new InvalidOperationException(e.getMessage());
        }
    }
    
    @Override
    public Enumeration getGroupNames (String login) throws InvalidOperationException, NoSuchUserException {
        
        Vector vector = new Vector();
        
        try
        {
            
            ResultSet rs = dbManager.select("APP.ROLES.NAME", "APP.USERS, APP.ROLES, APP.JT_USER_ROLE", "APP.USERS.LOGIN = '" + login + "' AND APP.USERS.ID = APP.JT_USER_ROLE.USER_FK AND APP.ROLES.ID = APP.JT_USER_ROLE.ROLE_FK");
            while (rs.next())
            {
                vector.add(rs.getString("NAME"));
            }
        }
        catch (SQLException e)
        {
            throw new InvalidOperationException(e.getMessage());
        }
        
        return vector.elements();
    }
    
    @Override
    public String getAuthType () {
        return "MonopolyAuth";
    }
    
    @Override
    public String getJAASContext () {
        return "monopolyRealm";
    }
    
    public boolean loginUser (String login, String password) throws InvalidOperationException, NoSuchUserException {
        boolean loginSuccessfull = false;
        
        try
        {
            ResultSet rs = dbManager.select("LOGIN", "APP.USERS", "APP.USERS.LOGIN = '" + login + "' AND APP.USERS.PASSWORD = '" + password + "'");
            if (rs.next())
            {
                loginSuccessfull = true;
            }
            else
            {
                throw new NoSuchUserException("username or password incorect");
            }
        }
        catch (SQLException e)
        {
            throw new InvalidOperationException(e.getMessage());
        }
        return loginSuccessfull;
    }
}


MonopolyLoginModule
Код

package net.monopolyclub.monopolylogin;

import java.util.LinkedList;
import java.util.Enumeration;
import com.sun.appserv.security.AppservPasswordLoginModule;

import javax.security.auth.login.LoginException;
import com.sun.enterprise.security.auth.realm.InvalidOperationException;
import com.sun.enterprise.security.auth.realm.NoSuchUserException;

public class MonopolyLoginModule extends AppservPasswordLoginModule
{
    private MonopolyRealm realm;
    
    @Override
    protected void authenticateUser () throws LoginException
    {
        Enumeration userGroupEnum = null;
        LinkedList<String> userGroupList = new LinkedList<String>();

        if (!(_currentRealm instanceof MonopolyRealm))
        {
            throw new LoginException();
        }
        else
        {
            realm = (MonopolyRealm) _currentRealm;
        }
        
        try
        {
            if (realm.loginUser(_username, _password))
            {
                try
                {
                    userGroupEnum = realm.getGroupNames(_username);
                }
                catch (InvalidOperationException e)
                {
                    throw new LoginException(e.getMessage());
                }
                catch (NoSuchUserException e)
                {
                    throw new LoginException(e.getMessage());
                }

                while (userGroupEnum.hasMoreElements())
                {
                    userGroupList.add((String) userGroupEnum.nextElement());
                }
            }
            else
            {
                throw new LoginException();
            }
        }
        catch (InvalidOperationException e)
        {
             throw new LoginException(e.getMessage());
        }
        catch (NoSuchUserException e)
        {
             throw new LoginException(e.getMessage());
        }
        commitUserAuthentication(userGroupList.toArray(new String[0]));
    }
}


Player
Код

package net.monopolyclub.game.faces;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.context.FacesContext;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import net.monopolyclub.game.ejb.PlayerEJB;
import net.monopolyclub.game.faces.utils.ImplicitNavigationManagerInterface;

@ManagedBean
@RequestScoped
public class Player
{
    @EJB
    private PlayerEJB player;
    @ManagedProperty("#{implicitNavigationManager}")
    private ImplicitNavigationManagerInterface navigator;

    private String email;
    private String password;
    private String confirmPassword;

    public Player ()
    {

    }

    @PostConstruct
    public void init ()
    {
        navigator.setRedirect(true);
    }
    
    public void checkIsAuthorized (ComponentSystemEvent cse)
    {
        navigator.jump("game");
    }

    public void registerNewUser ()
    {
        Long id = player.addNewUser(email, password);
    }

    public void login ()
    {
            
    }

    /* -- getters/setters -- */

    public String getEmail ()
    {
        return this.email;
    }

    public void setEmail (String email)
    {
        this.email = email;
    }

    public String getPassword ()
    {
        return this.password;
    }
    public void setPassword (String password)
    {
        this.password = password;
    }

    public String getConfirmPassword ()
    {
        return this.confirmPassword;
    }

    public void setConfirmPassword (String confirmPassword)
    {
        this.confirmPassword = confirmPassword;
    }

    public ImplicitNavigationManagerInterface getNavigator ()
    {
        return this.navigator;
    }

    public void setNavigator (ImplicitNavigationManagerInterface navigator)
    {
        this.navigator = navigator;
    }
}

PM MAIL   Вверх
devalentino
Дата 19.2.2012, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



я переписал метод login класса Player. Но у меня происходит исключение, незнаю как его избежать. Может кто-то с таким тоже сталкивался
Код

public void login ()
    {
            LoginHandler handler = new LoginHandler(email, password);
            try
            {
                loginContext = new LoginContext("monopolyRealm", handler);
                loginContext.login();
                System.out.println("login successfull");
            }
            catch (LoginException e) 
            {
                //System.out.println("login exception: " + e.getMessage());
                e.printStackTrace();
            }
    }

Код

package net.monopolyclub.game.util;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.CallbackHandler;

public class LoginHandler implements CallbackHandler
{
    private String login;
    private char[] password;
    
    public LoginHandler (String login, String password)
    {
        this.login = login;
        this.password = password.toCharArray();
    }
    
    @Override
    public void handle(Callback[] callbacks)
    {
        System.out.println("----------------------------------------------------");
        for (Callback callback : callbacks)
        {
           
            if (callback instanceof NameCallback)
            {
                System.out.println("2222222222222222222222222");
                NameCallback nc = (NameCallback) callback;
                nc.setName(login);
            }
            else if (callback instanceof PasswordCallback)
            {
                System.out.println("olololololololololool111111");
                PasswordCallback pc = (PasswordCallback) callback;
                pc.setPassword(password);
            }
        }
    }
}



Цитата

[#|2012-02-19T00:21:25.526+0300|SEVERE|glassfish3.1.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;|javax.security. auth.login.LoginException: No credentials.
at com.sun.appserv.security.AppservPasswordLoginModule.extractCredentials(AppservPasswordLoginModule.java:336)
at com.sun.appserv.security.AppservPasswordLoginModule.login(AppservPasswordLoginModule.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:784)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:698)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:695)
at javax.security.auth.login.LoginContext.login(LoginContext.java:594)
at net.monopolyclub.game.faces.Player.login(Player.java:5Cool
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:8Cool
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:9Cool
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722) 

PM MAIL   Вверх
devalentino
Дата 19.2.2012, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



Я переписал LoginModule, и все вроде как заработало. К сожалению информации очень очень мало даже на английском, и модуль пришлось писать по обрывкам отдельных постов на форумах, багтрекерах, блогах, и stackoverflow-ах. Может быть кому-то пригодится мой опыт, по этому ниже привожу свой код: 
Код

package net.monopolyclub.mlogin;

import java.util.Map;
import java.util.Enumeration;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.spi.LoginModule;
import java.io.IOException;
import javax.security.auth.login.LoginException;
import javax.security.auth.callback.UnsupportedCallbackException;
import com.sun.enterprise.security.auth.realm.InvalidOperationException;
import com.sun.enterprise.security.auth.realm.NoSuchUserException;
import com.sun.enterprise.security.auth.realm.BadRealmException;

public class MonopolyLoginModule implements LoginModule
{
    private MonopolyRealm realm;
    
    private Subject subject;
    private CallbackHandler callbackHandler;
    private Object sharedState;
    private Object options;

    private boolean authenticated = false;
    private String username;
    private String password;
    private Enumeration roles;

    @Override
    public void initialize(Subject subject, CallbackHandler callbackHandler,
            Map<String, ?> sharedState, Map<String, ?> options)
    {
        this.subject = subject;
        this.callbackHandler = callbackHandler;
        this.sharedState = sharedState;
        this.options = options;
    }

    @Override
    public boolean abort() throws LoginException
    {
        // TODO
        return true;
    }
    
    @Override
    public boolean commit() throws LoginException
    {
        if (authenticated)
        {
            while (roles.hasMoreElements())
            {
                subject.getPrincipals().add(new MPrincipal((String) roles.nextElement()));
            }
            subject.getPrincipals().add(new MPrincipal(username));
        }
        return authenticated;
    }

    @Override
    public boolean login() throws LoginException 
    {
        NameCallback nameCB = new NameCallback("Username");
        PasswordCallback passwordCB = new PasswordCallback("Password", true);
        Callback[] callbacks = new Callback[] { nameCB, passwordCB };
        try
        {
            callbackHandler.handle(callbacks);
            // Authenticate username/password
            username = nameCB.getName();
            password = String.valueOf(passwordCB.getPassword());
            
            realm = new MonopolyRealm();
            
            try
            {
                if (realm.loginUser(username, password))
                {
                    authenticated = true;
                    
                    roles = realm.getGroupNames(username);
                    
                    return authenticated;
                }
                else
                {
                    return false;
                }
            }
            catch (NoSuchUserException e)
            {
                throw new LoginException(e.getMessage());
            }
        }
        catch (IOException e)
        {
            throw new LoginException(e.getMessage());
        }
        catch (UnsupportedCallbackException e)
        {
            throw new LoginException(e.getMessage());
        }
        catch (InvalidOperationException e)
        {
            throw new LoginException(e.getMessage());
        }
    }

    @Override
    public boolean logout() throws LoginException
    {
       subject.getPrincipals().clear();
       authenticated = false;
       return true;
    }

}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1049 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.