Multiple identity stores
derkd Sep 6, 2009 11:04 AMHi all,
I have defined 2 identity stores because I have 2 different implementations of user who should login on my site.
I defined the stores in
components.xml
like this:
<security:identity authenticate-method="#{authenticationManager.authenticate}"/>
<security:jpa-identity-store name="jobSeekerIdentityStore"
user-class="nu.anoniemsolliciteren.account.jobseeker.JobSeekerAccount"
role-class="nu.anoniemsolliciteren.account.role.Role"/>
<security:jpa-identity-store name="employerIdentityStore"
user-class="nu.anoniemsolliciteren.account.employer.EmployerAccount"
role-class="nu.anoniemsolliciteren.account.role.Role"/>I also made an login method, it looks like this:
@Transactional
public boolean authenticate() {
log.info("authenticating {0}", credentials.getUsername());
try {
// currentAccount = jobSeekerAccountHome.getJobSeekerAccountByUserName(credentials.getUsername());
log.debug("try to do a lookup with username: " + credentials.getUsername());
currentAccount = (JobSeekerAccount) jobSeekerIdentityStore.lookupUser(credentials.getUsername());
if(currentAccount == null) {
log.debug("We didn't found the user in the jobseekers table, now try employer with username: " + credentials.getUsername());
currentAccount = (EmployerAccount) employerIdentityStore.lookupUser(credentials.getUsername());
}
if(currentAccount == null){
log.debug("could not find currentAccount");
throw new NoResultException();
}
if (currentAccount.getUserRoles() != null) {
Set<Role> roles = (Set<Role>)currentAccount.getUserRoles();
for (Role role : roles) {
log.debug("try to add the role " + role.getName() + " to identity");
if(identity != null){
identity.addRole(role.getName());
}else{
log.debug("identity == null");
return false;
}
}
}
if (!validatePassword(credentials.getUsername(), credentials.getPassword(), currentAccount)) {
return false;
}
identity.addRole("member");
return true;
} catch (NoResultException e) {
log.error(e);
return false;
}
}But now I need to know what kind of user is trying to login in. I now search both identity stores to find a match but if both implementations have the samen username than this method won't work anymore. I hoped a hidden field would do the trick but can't find an example. How can I a hidden field to the backing bean? Or does someone knows a better solution?
ps. my registration thing is based on thelabdude.blogspot.com/2009/05/updates-to-seam-user-registration.html
regards,
Derk