Thank you Leo for your reply
I forgot to mention that for the Identity Management I have used the entities of the seamspace example with annotations of course, but for the other entities i have used seam gen
this is my bean 'UserAccount'
package org.domain.test.entity;
import java.io.Serializable;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.hibernate.validator.NotNull;
import org.jboss.seam.annotations.security.management.UserEnabled;
import org.jboss.seam.annotations.security.management.UserPassword;
import org.jboss.seam.annotations.security.management.UserPrincipal;
import org.jboss.seam.annotations.security.management.UserRoles;
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "username"), name = "user_account")
public class UserAccount implements Serializable {
private static final long serialVersionUID = 6368734442192368866L;
private Long id;
private String username;
private String passwordHash;
private boolean enabled;
private Set<UserRole> roles;
private Member member;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotNull
@UserPrincipal
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@UserPassword
@Column(name = "password_hash")
public String getPasswordHash() {
return passwordHash;
}
public void setPasswordHash(String passwordHash) {
this.passwordHash = passwordHash;
}
@UserEnabled
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@UserRoles
@ManyToMany
@JoinTable(name = "user_account_role", joinColumns = @JoinColumn(name = "account_id"), inverseJoinColumns = @JoinColumn(name = "member_of_role"))
public Set<UserRole> getRoles() {
return roles;
}
public void setRoles(Set<UserRole> roles) {
this.roles = roles;
}
@OneToOne
@JoinColumn(name = "MEMBER_ID")
public Member getMember()
{
return member;
}
public void setMember(Member member)
{
this.member = member;
}
}
and the method 'UserAction'
package org.domain.test.session;
import static org.jboss.seam.ScopeType.CONVERSATION;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.security.management.IdentityManager;
@Name("userAction")
@Scope(CONVERSATION)
public class UserAction implements Serializable
{
private String firstname;
private String lastname;
private String username;
private String password;
private String confirm;
private List<String> roles;
private boolean enabled;
private boolean newUserFlag;
@In IdentityManager identityManager;
@Begin
public void createUser()
{
roles = new ArrayList<String>();
newUserFlag = true;
}
@Begin
public void editUser(String username)
{
this.username = username;
roles = identityManager.getGrantedRoles(username);
enabled = identityManager.isUserEnabled(username);
newUserFlag = false;
}
public String save()
{
if (newUserFlag)
{
return saveNewUser();
}
else
{
return saveExistingUser();
}
}
private String saveNewUser()
{
if (password == null || !password.equals(confirm))
{
StatusMessages.instance().addToControl("password", "Passwords do not match");
return "failure";
}
boolean success = identityManager.createUser(username, password, firstname, lastname);
if (success)
{
for (String role : roles)
{
identityManager.grantRole(username, role);
}
if (!enabled)
{
identityManager.disableUser(username);
}
Conversation.instance().end();
return "success";
}
return "failure";
}
private String saveExistingUser()
{
// Check if a new password has been entered
if (password != null && !"".equals(password))
{
if (!password.equals(confirm))
{
StatusMessages.instance().addToControl("password", "Passwords do not match");
return "failure";
}
else
{
identityManager.changePassword(username, password);
}
}
List<String> grantedRoles = identityManager.getGrantedRoles(username);
if (grantedRoles != null)
{
for (String role : grantedRoles)
{
if (!roles.contains(role)) identityManager.revokeRole(username, role);
}
}
for (String role : roles)
{
if (grantedRoles == null || !grantedRoles.contains(role))
{
identityManager.grantRole(username, role);
}
}
if (enabled)
{
identityManager.enableUser(username);
}
else
{
identityManager.disableUser(username);
}
Conversation.instance().end();
return "success";
}
public String getFirstname()
{
return firstname;
}
public void setFirstname(String firstname)
{
this.firstname = firstname;
}
public String getLastname()
{
return lastname;
}
public void setLastname(String lastname)
{
this.lastname = lastname;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getConfirm()
{
return confirm;
}
public void setConfirm(String confirm)
{
this.confirm = confirm;
}
public List<String> getRoles()
{
return roles;
}
public void setRoles(List<String> roles)
{
this.roles = roles;
}
public boolean isEnabled()
{
return enabled;
}
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
}
}
what I'm looking for now is how to create a member and assign a default role for all memmbers
I tried to add a fonction 'save' in my bean 'MemberHome'
package org.domain.test.session;
import org.domain.test.entity.*;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.security.Identity;
import org.jboss.seam.security.RunAsOperation;
import org.jboss.seam.security.management.IdentityManager;
import org.jboss.seam.annotations.In;
import javax.persistence.EntityManager;
import org.jboss.seam.faces.FacesMessages;
@Name("memberHome")
public class MemberHome extends EntityHome<Member> {
private Member member;
@In
private EntityManager entityManager;
@In
private Identity identity;
@In
private IdentityManager identityManager;
private UserAccount newAccount;
private String username;
private boolean verified;
/**
* Password confirmation
*/
private String password;
private String confirm;
public void setMemberMemberId(Integer id) {
setId(id);
}
public Integer getMemberMemberId() {
return (Integer) getId();
}
@Override
protected Member createInstance() {
Member member = new Member();
return member;
}
public void wire() {
getInstance();
}
public boolean isWired() {
return true;
}
public Member getDefinedInstance() {
return isIdDefined() ? getInstance() : null;
}
public void save() {
member = new Member();
verified = (confirm != null && confirm.equals(password));
if (!verified)
{
FacesMessages.instance().addToControl("confirmPassword", "Passwords do not match");
}
entityManager.persist(member);
new RunAsOperation() {
public void execute() {
identityManager.createUser(username, password);
identityManager.grantRole(username, "collaborateur");
}
}.addRole("admin")
.run();
newAccount.setMember(member);
newAccount = entityManager.merge(newAccount);
// Login the user
identity.getCredentials().setUsername(username);
identity.getCredentials().setPassword(password);
identity.login();
}
public Member getMember()
{
return member;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getConfirm()
{
return confirm;
}
public void setConfirm(String confirm)
{
this.confirm = confirm;
}
public boolean isVerified()
{
return verified;
}
}
but without result :(
PS: you are right about the UniqueConstratint on the memberName