ObjectDB ObjectDB

openejb jpa jaas module

#1

hello , i've finished jpa jaas module.

Here it is :

package com.bayner.auth;

import com.bayner.jpa.Principals;
import com.bayner.jpa.UserInfo;
import com.bayner.jpa.UserPrincipal;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.security.auth.Subject;
import javax.security.auth.callback.*;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import java.io.IOException;
import java.security.Principal;
import java.util.*;

/**
* Created with IntelliJ IDEA.
* User: apple
* Date: 31.01.2013
* Time: 06:01
* To change this template use File | Settings | File Templates.
*/
public class JPALoginModule implements LoginModule {

    private Subject                 subject;
    private CallbackHandler         callbackHandler;
    private EntityManagerFactory    entityManagerFactory;
    private EntityManager           entityManager;
    protected Map<String, ?>        sharedState = new HashMap<String, Object>();
    private String                  username;
    private char[]                  password;
    private Map                     options;
    /**
     * User.
     */
    protected String                login;
    /**
     * Password.
     */
    protected String                pass;

    private boolean                 succeeded;
    private UserInfo                info;

    @Override
    public final void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
        //To change body of implemented methods use File | Settings | File Templates.
        // TODO Auto-generated method stub
        this.subject = subject;
        this.callbackHandler = callbackHandler;
        this.sharedState = sharedState;
        this.options = options;

        final Properties properties = new Properties();
        properties.put("javax.persistence.jdbc.user",options.get("user"));
        properties.put("javax.persistence.jdbc.password", options.get("password") );
        //objectdb://localhost:6136/myDbFile.odb

        entityManagerFactory = Persistence.createEntityManagerFactory((String) options.get("url"));
        entityManager = entityManagerFactory.createEntityManager( );
    }

    /**
           * Attempt authentication
           *
           * <p>
           *
           * @param getPasswdFromSharedState boolean that tells this method whether
           *                to retrieve the password from the sharedState.
    */
    private final void attemptAuthentication(boolean getPasswdFromSharedState) throws LoginException {

    }

    @Override
    public final boolean login() throws LoginException {
        try {
            getUsernamePassword();
            try {

                info = entityManager.find( UserInfo.class , username );
                if(info != null) {
                    String password = info.getPassword();
                    if(password.equals(pass)) {
                        succeeded = true;
                        return true;
                    } else {
                        succeeded = false;
                        return false;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            succeeded = true;
            //Principals and Credentials
        } catch (UnsupportedCallbackException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            succeeded = false;
            return false;
        }


        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public final boolean commit() throws LoginException {
        if (succeeded == false) {
            return false;
        } else {
            final Set<Principal> principals = subject.getPrincipals();
            final int id = info.getId();
            final TypedQuery<UserPrincipal> namedQuery = entityManager.createNamedQuery("UserPrincipal.findAll", UserPrincipal.class);
            List<UserPrincipal> resultList = namedQuery.getResultList();
            for (UserPrincipal userPrincipal : resultList) {
                final int principalId = userPrincipal.getPrincipalId();
                final Principals principals1 = entityManager.find(Principals.class, principalId);
                subject.getPrincipals().add(principals1);
            }
        }
        return true;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public final boolean abort() throws LoginException {
        final Set<Principal> principals = subject.getPrincipals();
        if (principals != null) {
            principals.clear();
        }
        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public final boolean logout() throws LoginException {
        final Set<Principal> principals = subject.getPrincipals();
        principals.clear();
        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }


    protected final void getUsernamePassword() throws LoginException, UnsupportedCallbackException {
        if (callbackHandler == null)
            throw new LoginException("Error: no CallbackHandler available to garner authentication information from the user");

        final Callback[] callbacks = new Callback[2];
        callbacks[0] = new NameCallback(null);
        callbacks[1] = new PasswordCallback(null, false);

        try {
            callbackHandler.handle(callbacks);
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        login = ((NameCallback) callbacks[0]).getName();
        char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
        pass = new String(tmpPassword);
        ((PasswordCallback) callbacks[1]).clearPassword();
    }
}





package com.bayner.jpa;

import javax.persistence.*;
import java.io.Serializable;
import java.security.Principal;

/**
* Created with IntelliJ IDEA.
* User: apple
* Date: 02.02.2013
* Time: 23:15
* To change this template use File | Settings | File Templates.
*/

@Cacheable

@Entity

@SequenceGenerator(
        name = "gen",
        initialValue = 10000,
        allocationSize = 50
)
public class Principals implements Serializable,Principal {

    private String principalName;

    @GeneratedValue(strategy = GenerationType.SEQUENCE , generator = "gen")
    @Id
    private int    principalId;

    public String getPrincipalName() {
        return principalName;
    }

    public void setPrincipalName(String principalName) {
        this.principalName = principalName;
    }

    public int getPrincipalId() {
        return principalId;
    }

    public void setPrincipalId(int principalId) {
        this.principalId = principalId;
    }

    @Override
    public String getName() {
        return principalName;  //To change body of implemented methods use File | Settings | File Templates.
    }
}




package com.bayner.jpa;

import network.data.Settings;

import javax.jdo.annotations.Index;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

/**
* Created with IntelliJ IDEA.
* User: apple
* Date: 27.01.2013
* Time: 02:30
* To change this template use File | Settings | File Templates.
*/


@Cacheable

@Entity

@SequenceGenerator(name="seq", initialValue=10000)

@NamedQueries({
        @NamedQuery(name = "UserInfo.setClientSettings",query = "update UserInfo ui set ui.settings= :settings") ,
        @NamedQuery(name = "UserInfo.setClientSettingsForUser",query = "update UserInfo ui set ui.settings= :settings where ui.user=:user"),
        @NamedQuery(name = "UserInfo.getClientSettings" , query = "select  ui.settings from UserInfo ui where ui.user=:user" ),
        @NamedQuery(name = "UserInfo.getByClientId" , query = "select  ui from UserInfo ui where ui.id = :id"),
        @NamedQuery(name = "UserInfo.getByMailAddress" , query = "select  ui from UserInfo ui where ui.mailAddress = :mail")
})
public class UserInfo implements Serializable {
    @GeneratedValue(strategy = GenerationType.AUTO,generator = "seq")
    @Index
    private int      id;

    @Id
    private String   user;
    private String   password;

    @Index
    private String   mailAddress;


    @OneToOne
    private Settings settings;

    private String   phoneNumber;


    @OneToMany
    private List<UserPrincipal> principals;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

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

    public String getMailAddress() {
        return mailAddress;
    }

    public void setMailAddress(String mailAddress) {
        this.mailAddress = mailAddress;
    }

    public Settings getSettings() {
        return settings;
    }

    public void setSettings(Settings settings) {
        this.settings = settings;
    }

    public List<UserPrincipal> getPrincipals() {
        return principals;
    }

    public void setPrincipals(List<UserPrincipal> principals) {
        this.principals = principals;
    }
}






package com.bayner.jpa;

import javax.jdo.annotations.Index;
import javax.persistence.*;
import java.io.Serializable;

/**
* Created with IntelliJ IDEA.
* User: apple
* Date: 02.02.2013
* Time: 23:09
* To change this template use File | Settings | File Templates.
*/

@Cacheable

@Entity

@NamedQueries(
        @NamedQuery(name = "UserPrincipal.findAll",query = "SELECT p from UserPrincipal p where p.userId=:id")
)
public class UserPrincipal implements Serializable {
    @Id
    private int userId;
    @Index
    private int principalId;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getPrincipalId() {
        return principalId;
    }

    public void setPrincipalId(int principalId) {
        this.principalId = principalId;
    }
}





package network.data;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.*;

/**
* Created with IntelliJ IDEA.
* User: apple
* Date: 24.01.2013
* Time: 03:13
* To change this template use File | Settings | File Templates.
*/

@Entity
public class Settings implements Serializable {

    private static final long       serialVersionUID = -7516039939801615889L;
    private transient static Settings         instance;

    public static Settings getInstance() {
        return instance;
    }

    public static final void init() {
        instance = new Settings();
    }

    private Settings() {
    }


    private String computerName;
    private String serverName;
    @Id
    private int    id;

    public String getComputerName() {
        return computerName;
    }

    public void setComputerName(String computerName) {
        this.computerName = computerName;
    }

    public String getServerName() {
        return serverName;
    }

    public void setServerName(String serverName) {
        this.serverName = serverName;
    }


    public final void save() {
        try {
            final FileOutputStream fileOutputStream = new FileOutputStream( "settings.obj" );
            final ObjectOutputStream objectOutputStream = new ObjectOutputStream( fileOutputStream );
            objectOutputStream.writeObject( this );
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }


    public final void load() {
        try {
            final FileInputStream fileInputStream = new FileInputStream( "settings.obj" );
            final ObjectInputStream objectInputStream = new ObjectInputStream( fileInputStream );
            final Settings settings = (Settings) objectInputStream.readObject();
            setComputerName( settings.getComputerName() );
            setServerName( settings.getServerName() );
        } catch (Exception epx) {

        }
    }
}
edit
delete
#2

Thank you for sharing the module.

Any feedback from other users that try the module would be welcome.

ObjectDB Support
edit
delete

Reply

To post on this website please sign in.