Hallo ihr Lieben!
Ich habe meine Applikation mittels Spring Security abgesichert, sodass nurnoch eingeloggte Benutzer sich am System anmelden können. Jeder Benutzer ist also authentifiziert und autorisiert.
Ich habe eine Klasse "Profile", die den User darstellt, und einen eigenen UserDetailsService implementiert, sodass ich ne Datenbank mit meiner eigenen User-Klasse zur Authentifizierung benutzen kann:
[Java]@Service
public class ProfileUserDetailsService implements UserDetailsService {
private ProfileDao profileDao;
public void setProfileDao(ProfileDao profileDao) {
this.profileDao = profileDao;
}
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
Profile profile = profileDao.getByUsername(username);
if (profile == null) {
throw new UsernameNotFoundException("Benutzer konnte nicht gefunden werden");
}
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (Authority role : profile.getAuthorities()) {
authorities.add(new GrantedAuthorityImpl(role.getName()));
}
return new User(profile.getUsername(), profile.getPassword(),
profile.isEnabled(), profile.isEnabled(), profile.isEnabled(),
profile.isEnabled(), authorities);
}
}[/code]
Nun möchte ich folgendes: Wenn der (eingeloggte) Benutzer eine neue "News" schreibt, soll der News direkt der Benutzer in einem Attribut zugewiesen werden.
[Java]public class News {
private long id;
private Profile author;
private String title;
private String content;
// ...
}[/code]
Wie soll ich das ganze denn nun am besten handlen? Eine Möglichkeit die mir einfallen würde wäre jetzt, im NewsService einfach auf den ProfileDao zuzugreifen, und dort die User-ENtity über den Namen zu ermitteln. Den bekomme ich ja über SecurityContextHolder.getContext().getAuthentication().getName().
Was mir daran nicht gefallen würde: Ich hätte im Service-Layer ne direkte Abhängigkeit zu Spring.
Jemand ne Idee? Evtl. den Aufruf des SecurityContextHolders irgendwo kapseln?
Oder kann ich die User-Entity gar irgendwie injezieren?
Ich habe meine Applikation mittels Spring Security abgesichert, sodass nurnoch eingeloggte Benutzer sich am System anmelden können. Jeder Benutzer ist also authentifiziert und autorisiert.
Ich habe eine Klasse "Profile", die den User darstellt, und einen eigenen UserDetailsService implementiert, sodass ich ne Datenbank mit meiner eigenen User-Klasse zur Authentifizierung benutzen kann:
Java:
@Entity
public class Profile implements Serializable {
private static final long serialVersionUID = 1L;
private long id;
private String username;
private String password;
private boolean enabled;
private Set<Authority> authorities;
// private boolean accountNonExpired;
// private boolean credentialsNonExpired;
// private boolean accountNonLocked;
private String firstName;
private String lastName;
private String email;
@Id
@GeneratedValue
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
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 boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@ManyToMany
public Set<Authority> getAuthorities() {
return authorities;
}
public void setAuthorities(Set<Authority> authorities) {
this.authorities = authorities;
}
@NotNull
@NotEmpty
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@NotNull
@NotEmpty
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@NotNull
@NotEmpty
@Email(message = "Keine gültige Email-Adresse")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
[Java]@Service
public class ProfileUserDetailsService implements UserDetailsService {
private ProfileDao profileDao;
public void setProfileDao(ProfileDao profileDao) {
this.profileDao = profileDao;
}
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
Profile profile = profileDao.getByUsername(username);
if (profile == null) {
throw new UsernameNotFoundException("Benutzer konnte nicht gefunden werden");
}
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (Authority role : profile.getAuthorities()) {
authorities.add(new GrantedAuthorityImpl(role.getName()));
}
return new User(profile.getUsername(), profile.getPassword(),
profile.isEnabled(), profile.isEnabled(), profile.isEnabled(),
profile.isEnabled(), authorities);
}
}[/code]
Nun möchte ich folgendes: Wenn der (eingeloggte) Benutzer eine neue "News" schreibt, soll der News direkt der Benutzer in einem Attribut zugewiesen werden.
[Java]public class News {
private long id;
private Profile author;
private String title;
private String content;
// ...
}[/code]
Wie soll ich das ganze denn nun am besten handlen? Eine Möglichkeit die mir einfallen würde wäre jetzt, im NewsService einfach auf den ProfileDao zuzugreifen, und dort die User-ENtity über den Namen zu ermitteln. Den bekomme ich ja über SecurityContextHolder.getContext().getAuthentication().getName().
Was mir daran nicht gefallen würde: Ich hätte im Service-Layer ne direkte Abhängigkeit zu Spring.
Jemand ne Idee? Evtl. den Aufruf des SecurityContextHolders irgendwo kapseln?
Oder kann ich die User-Entity gar irgendwie injezieren?