[jboss-cvs] jboss-seam/src/main/org/jboss/seam/security/management ...

Shane Bryzak sbryzak at redhat.com
Mon Dec 10 00:57:21 EST 2007


  User: sbryzak2
  Date: 07/12/10 00:57:21

  Modified:    src/main/org/jboss/seam/security/management   
                        IdentityManager.java IdentityStore.java
                        JpaIdentityStore.java
  Log:
  identity manager-based authentication
  
  Revision  Changes    Path
  1.3       +24 -4     jboss-seam/src/main/org/jboss/seam/security/management/IdentityManager.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: IdentityManager.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/security/management/IdentityManager.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- IdentityManager.java	10 Dec 2007 01:58:47 -0000	1.2
  +++ IdentityManager.java	10 Dec 2007 05:57:21 -0000	1.3
  @@ -69,9 +69,19 @@
         return instance;
      }
      
  -   public UserAccount createAccount(String username, String password)
  +   public boolean createAccount(String name, String password)
      {
  -      return identityStore.createAccount(username, password); 
  +      return identityStore.createAccount(name, password); 
  +   }
  +   
  +   public boolean enableAccount(String name)
  +   {
  +      return identityStore.enableAccount(name);
  +   }
  +   
  +   public boolean disableAccount(String name)
  +   {
  +      return identityStore.disableAccount(name);
      }
      
      public boolean grantRole(String name, String role)
  @@ -104,6 +114,16 @@
         return identityStore.getGrantedRoles(name);
      }
   
  +   public List<String> getImpliedRoles(String name)
  +   {
  +      return identityStore.getImpliedRoles(name);
  +   }
  +   
  +   public boolean authenticate(String username, String password)
  +   {
  +      return identityStore.authenticate(username, password);
  +   }
  +   
      public IdentityStore getIdentityStore()
      {
         return identityStore;
  
  
  
  1.3       +8 -1      jboss-seam/src/main/org/jboss/seam/security/management/IdentityStore.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: IdentityStore.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/security/management/IdentityStore.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- IdentityStore.java	10 Dec 2007 01:58:47 -0000	1.2
  +++ IdentityStore.java	10 Dec 2007 05:57:21 -0000	1.3
  @@ -16,16 +16,23 @@
      private String hashFunction = "MD5";
      private String hashCharset = "UTF-8";
   
  -   protected abstract UserAccount createAccount(String username, String password);
  +   protected abstract boolean createAccount(String username, String password);
  +   protected abstract boolean deleteAccount(String name);
      
      protected abstract boolean grantRole(String name, String role);
      protected abstract boolean revokeRole(String name, String role);
      
  +   protected abstract boolean enableAccount(String name);
  +   protected abstract boolean disableAccount(String name);   
  +   
      protected abstract List<String> listUsers();
      protected abstract List<String> listUsers(String filter);
      protected abstract List<String> listRoles();
      
      protected abstract List<String> getGrantedRoles(String name);
  +   protected abstract List<String> getImpliedRoles(String name);
  +   
  +   protected abstract boolean authenticate(String username, String password);
      
      protected String hashPassword(String password)
      {
  
  
  
  1.3       +138 -52   jboss-seam/src/main/org/jboss/seam/security/management/JpaIdentityStore.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: JpaIdentityStore.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/security/management/JpaIdentityStore.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- JpaIdentityStore.java	10 Dec 2007 01:58:47 -0000	1.2
  +++ JpaIdentityStore.java	10 Dec 2007 05:57:21 -0000	1.3
  @@ -1,6 +1,7 @@
   package org.jboss.seam.security.management;
   
   import static org.jboss.seam.ScopeType.APPLICATION;
  +import static org.jboss.seam.security.management.UserAccount.AccountType;
   
   import java.util.ArrayList;
   import java.util.HashSet;
  @@ -8,6 +9,7 @@
   import java.util.Set;
   
   import javax.persistence.EntityManager;
  +import javax.persistence.NoResultException;
   
   import org.jboss.seam.Component;
   import org.jboss.seam.annotations.Create;
  @@ -47,7 +49,7 @@
      }
      
      @Override
  -   protected UserAccount createAccount(String username, String password)
  +   public boolean createAccount(String username, String password)
      {
         try
         {
  @@ -72,7 +74,7 @@
            
            persistAccount(account);
            
  -         return account;
  +         return true;
         }
         catch (Exception ex)
         {
  @@ -88,21 +90,18 @@
      }
      
      @Override
  -   public boolean grantRole(String name, String role)
  +   public boolean deleteAccount(String name)
      {
  -      UserAccount account = getAccount(name);
  -      
  -      if (account == null)
  -      {
  -         throw new IdentityManagementException("No such account: " + name);
  +      UserAccount account = validateUser(name);
  +      getEntityManager().remove(account);
  +      return true;
         }
         
  -      UserAccount roleToGrant = getRole(role);
  -      
  -      if (roleToGrant == null)
  +   @Override
  +   public boolean grantRole(String name, String role)
         {
  -         throw new IdentityManagementException("No such role: " + role);
  -      }
  +      UserAccount account = validateUser(name);      
  +      UserAccount roleToGrant = validateRole(role);
         
         if (account.getMemberships() == null)
         {
  @@ -114,6 +113,7 @@
         }
   
         account.getMemberships().add(roleToGrant);
  +      mergeAccount(account);
         
         return true;
      }
  @@ -121,34 +121,52 @@
      @Override
      public boolean revokeRole(String name, String role)
      {
  -      UserAccount account = getAccount(name);
  -      
  -      if (account == null)
  -      {
  -         throw new IdentityManagementException("No such account: " + name);
  +      UserAccount account = validateUser(name);      
  +      UserAccount roleToRevoke = validateRole(role);      
  +      boolean success = account.getMemberships().remove(roleToRevoke);
  +      mergeAccount(account);
  +      return success;
         }
         
  -      UserAccount roleToRevoke = getRole(role);
  +   @Override
  +   public boolean enableAccount(String name)
  +   {
  +      UserAccount account = validateUser(name);        
         
  -      if (roleToRevoke == null)
  +      // If it's already enabled return false
  +      if (account.isEnabled())
         {
  -         throw new IdentityManagementException("No such role: " + role);
  +         return false;
         }
         
  -      return account.getMemberships().remove(roleToRevoke);
  +      account.setEnabled(true);
  +      mergeAccount(account);
  +      
  +      return true;
      }
      
      @Override
  -   public List<String> getGrantedRoles(String name)
  +   public boolean disableAccount(String name)
      {
  -      UserAccount account = getAccount(name);
  +      UserAccount account = validateUser(name);       
         
  -      if (account == null)
  +      // If it's already enabled return false
  +      if (!account.isEnabled())
         {
  -         return null;
  +         return false;
         }
  -      else
  +      
  +      account.setEnabled(false);
  +      mergeAccount(account);
  +      
  +      return true;
  +   }
  +   
  +   @Override
  +   public List<String> getGrantedRoles(String name)
         {
  +      UserAccount account = validateUser(name);
  +
            List<String> roles = new ArrayList<String>();
            
            for (UserAccount membership : account.getMemberships())
  @@ -161,18 +179,73 @@
            
            return roles;
         }      
  +   
  +   @Override
  +   public List<String> getImpliedRoles(String name)
  +   {
  +      UserAccount account = validateUser(name);
  +
  +      Set<String> roles = new HashSet<String>();
  +
  +      for (UserAccount membership : account.getMemberships())
  +      {
  +         if (membership.getAccountType().equals(UserAccount.AccountType.role))
  +         {
  +            addRoleAndMemberships(membership.getUsername(), roles);
      }
  +      }            
  +      
  +      return new ArrayList<String>(roles);
  +   }
  +   
  +   private void addRoleAndMemberships(String role, Set<String> roles)
  +   {
  +      UserAccount roleAccount = validateRole(role);
  +      roles.add(role);
      
  -   protected UserAccount getAccount(String name)
  +      for (UserAccount membership : roleAccount.getMemberships())
  +      {
  +         if (!roles.contains(membership.getUsername()))
  +         {
  +            addRoleAndMemberships(membership.getUsername(), roles);
  +         }
  +      }            
  +   }
  +   
  +   @Override
  +   public boolean authenticate(String username, String password)
  +   {
  +      UserAccount account = validateUser(username);
  +      
  +      if (account == null || !account.getAccountType().equals(AccountType.user)
  +            || !account.isEnabled())
  +      {
  +         return false;
  +      }
  +      
  +      return hashPassword(password).equals(account.getPasswordHash());
  +   }
  +   
  +   protected UserAccount validateUser(String name)
  +   {      
  +      try
      {
         return (UserAccount) getEntityManager().createQuery(
  -            "from " + accountClass.getName() + " where username = :username")
  +            "from " + accountClass.getName() + " where username = :username and " +
  +            "accountType = :accountType")
               .setParameter("username", name)
  +            .setParameter("accountType", AccountType.user)
               .getSingleResult();      
      }
  +      catch (NoResultException ex)
  +      {
  +         throw new IdentityManagementException("No such user: " + name);         
  +      }
  +   }
      
  -   protected UserAccount getRole(String name)
  +   protected UserAccount validateRole(String name)
      {
  +      // The role *should* be cached
         for (UserAccount ua : roleCache)
         {
            if (ua.getUsername().equals(name))
  @@ -181,15 +254,23 @@
            }
         }
         
  -      UserAccount ua = getAccount(name); 
  -      
  -      if (ua.getAccountType().equals(UserAccount.AccountType.role))
  +      try
         {
  -         return ua;
  +         // As a last ditch effort, check the db
  +         UserAccount role = (UserAccount) getEntityManager().createQuery(
  +            "from " + accountClass.getName() + " where username = :username and " +
  +            "accountType = :accountType")
  +            .setParameter("username", name)
  +            .setParameter("accountType", AccountType.role)
  +            .getSingleResult();
  +         
  +         roleCache.add(role);
  +         
  +         return role;
         }
  -      else
  +      catch (NoResultException ex)
         {
  -         throw new RuntimeException("No such role: " + name);
  +         throw new IdentityManagementException("No such role: " + name);         
         }
      }
      
  @@ -199,7 +280,7 @@
         return getEntityManager().createQuery(
               "select username from " + accountClass.getName() + 
               " where accountType = :accountType")
  -            .setParameter("accountType", UserAccount.AccountType.user)
  +            .setParameter("accountType", AccountType.user)
               .getResultList();      
      }
      
  @@ -209,7 +290,7 @@
         return getEntityManager().createQuery(
               "select username from " + accountClass.getName() + 
               " where accountType = :accountType and lower(username) like :username")
  -            .setParameter("accountType", UserAccount.AccountType.user)
  +            .setParameter("accountType", AccountType.user)
               .setParameter("username", "%" + (filter != null ? filter.toLowerCase() : "") + 
                     "%")
               .getResultList();
  @@ -221,7 +302,7 @@
         return getEntityManager().createQuery(
               "select username from " + accountClass.getName() + 
               " where accountType = :accountType")
  -            .setParameter("accountType", UserAccount.AccountType.role)
  +            .setParameter("accountType", AccountType.role)
               .getResultList();      
      }   
      
  @@ -230,6 +311,11 @@
         getEntityManager().persist(account);
      }
      
  +   protected UserAccount mergeAccount(UserAccount account)
  +   {
  +      return getEntityManager().merge(account);
  +   }
  +   
      private EntityManager getEntityManager()
      {
         return (EntityManager) Component.getInstance(entityManagerName);
  
  
  



More information about the jboss-cvs-commits mailing list