[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