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) { } } }