Howto mettre en œuvre le Printemps de la Sécurité de l'Utilisateur/Autorités avec Hibernate/JPA2?

Je suis en train de mettre en œuvre des DAOs de travailler avec Ressort de Sécurité de l'authentification de base de données dans Hibernate/JPA2. Printemps utilise les relations suivantes et les associations afin de représenter l'utilisateur & rôles:

Howto mettre en œuvre le Printemps de la Sécurité de l'Utilisateur/Autorités avec Hibernate/JPA2?

présent que postgresql créer une requête:

CREATE TABLE users
(
  username character varying(50) NOT NULL,
  "password" character varying(50) NOT NULL,
  enabled boolean NOT NULL,
  CONSTRAINT users_pkey PRIMARY KEY (username)
);
CREATE TABLE authorities
(
  username character varying(50) NOT NULL,
  authority character varying(50) NOT NULL,
  CONSTRAINT fk_authorities_users FOREIGN KEY (username)
      REFERENCES users (username) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

L'aide du conseil des implémentations de GrantedAuthorities, UserDetailsService et UserDetailsmanager, tout va bien. Cependant, je ne suis pas satisfait avec le JDBC mise en œuvre de Printemps et voudrais écrire ma propre. Pour ce faire, j'ai essayé de créer une représentation des relations de business objects suivants:

L'entité utilisateur:

@Entity
@Table(name = "users", uniqueConstraints = {@UniqueConstraint(columnNames = {"username"})})
public class AppUser implements UserDetails, CredentialsContainer {
private static final long serialVersionUID = -8275492272371421013L;
@Id
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "password", nullable = false)
@NotNull
private String password;
@OneToMany(
fetch = FetchType.EAGER, cascade = CascadeType.ALL,
mappedBy = "appUser"
)
private Set<AppAuthority> appAuthorities;
@Column(name = "accountNonExpired")
private Boolean accountNonExpired;
@Column(name = "accountNonLocked")
private Boolean accountNonLocked;
@Column(name = "credentialsNonExpired")
private Boolean credentialsNonExpired;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "personalinformation_fk", nullable = true)
@JsonIgnore
private PersonalInformation personalInformation;
@Column(name = "enabled", nullable = false)
@NotNull
private Boolean enabled;
public AppUser(
String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends AppAuthority> authorities,
PersonalInformation personalInformation
) {
if (((username == null) || "".equals(username)) || (password == null)) {
throw new IllegalArgumentException("Cannot pass null or empty values to constructor");
}
this.username = username;
this.password = password;
this.enabled = enabled;
this.accountNonExpired = accountNonExpired;
this.credentialsNonExpired = credentialsNonExpired;
this.accountNonLocked = accountNonLocked;
this.appAuthorities = Collections.unmodifiableSet(sortAuthorities(authorities));
this.personalInformation = personalInformation;
}
public AppUser() {
}
@JsonIgnore
public PersonalInformation getPersonalInformation() {
return personalInformation;
}
@JsonIgnore
public void setPersonalInformation(PersonalInformation personalInformation) {
this.personalInformation = personalInformation;
}
//Getters, setters 'n other stuff

Et l'autorité de l'entité au titre de la mise en œuvre de GrantedAuthorities:

@Entity
@Table(name = "authorities", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})
public class AppAuthority implements GrantedAuthority, Serializable {
//~ Instance fields ================================================================================================
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "authority", nullable = false)
private String authority;
//Here comes the buggy attribute. It is supposed to repesent the
//association username<->username, but I just don't know how to
//implement it 
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "appuser_fk")
private AppUser appUser;
//~ Constructors ===================================================================================================
public AppAuthority(String username, String authority) {
Assert.hasText(authority,
"A granted authority textual representation is required");
this.username = username;
this.authority = authority;
}
public AppAuthority() {
}
//Getters 'n setters 'n other stuff

Mon problème est le @ManyToOne assoc. de AppAuthorities: Il est censé être le "nom d'utilisateur", mais d'essayer et cela déclenche une erreur, parce que j'en ai à classifier que l'attribut comme String ... alors que Hibernate s'attend l'entité associée. Donc, ce que je tryied est réellement fournir la bonne entité et la création de l'association par @JoinColumn(name = "appuser_fk"). C'est, bien sûr, des ordures, parce que pour le chargement de l'Utilisateur, je vais avoir la clé étrangère dans username, tandis que Hibernate recherches dans appuser_fk, qui sera toujours vide.

Voici donc ma question: avez-vous des suggestions sur la façon de modifier le dessus décrite ci-dessus code afin d'obtenir une bonne JPA2 mise en œuvre du modèle de données?

Grâce

OriginalL'auteur Ta Sas | 2010-09-12