package org.freezo.domain; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.MapsId; import javax.persistence.OneToOne; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Version; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Type; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @Entity @JsonIgnoreProperties({ "id", "version", "password", "user", "disabled", "locked" }) public class Account implements UserDetails { private static final long serialVersionUID = 572162725149530080L; @Id private long id; @Column(length = 50, unique = true, nullable = false) private String username; @Column(length = 60) private String password; @Temporal(TemporalType.TIMESTAMP) private Date lastSuccessAuth; @Column(length = 45) private String lastSuccessAuthIp; @Temporal(TemporalType.TIMESTAMP) private Date lastFailedAuth; @Column(length = 45) private String lastFailedAuthIp; private int failedAuthCounter; @Type(type = "yes_no") private boolean disabled; @Type(type = "yes_no") private boolean locked; @Temporal(TemporalType.TIMESTAMP) private Date accountExpirationDate; @Temporal(TemporalType.TIMESTAMP) private Date credentialsExpirationDate; @ElementCollection(fetch = FetchType.EAGER) @Column(name = "role") @BatchSize(size = 50) private final Set<String> authorities = new HashSet<>(); @OneToOne(fetch = FetchType.LAZY) @MapsId private User user; @Version private long version; @Override public String toString() { final ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE); return builder.append("id", id).append("username", username).append("version", version).toString(); } public long getId() { return id; } @Override public String getUsername() { return username; } public void setUsername(final String username) { this.username = username; } @Override public String getPassword() { return password; } public void setPassword(final String password) { this.password = password; } public Date getLastSuccessAuth() { return lastSuccessAuth; } public void setLastSuccessAuth(final Date lastSuccessAuth) { this.lastSuccessAuth = lastSuccessAuth; } public String getLastSuccessAuthIp() { return lastSuccessAuthIp; } public void setLastSuccessAuthIp(final String lastSuccessAuthIp) { this.lastSuccessAuthIp = lastSuccessAuthIp; } public Date getLastFailedAuth() { return lastFailedAuth; } public void setLastFailedAuth(final Date lastFailedAuth) { this.lastFailedAuth = lastFailedAuth; } public String getLastFailedAuthIp() { return lastFailedAuthIp; } public void setLastFailedAuthIp(final String lastFailedAuthIp) { this.lastFailedAuthIp = lastFailedAuthIp; } public int getFailedAuthCounter() { return failedAuthCounter; } public void setFailedAuthCounter(final int failedAuthCounter) { this.failedAuthCounter = failedAuthCounter; } @Override public boolean isEnabled() { return !disabled; } public boolean isDisabled() { return disabled; } public void setDisabled(final boolean disabled) { this.disabled = disabled; } @Override @JsonProperty("nonLocked") public boolean isAccountNonLocked() { return !locked; } public boolean isLocked() { return locked; } public void setLocked(final boolean locked) { this.locked = locked; } @Override @JsonProperty("nonExpired") public boolean isAccountNonExpired() { return accountExpirationDate == null || accountExpirationDate.after(new Date()); } @JsonProperty("expirationDate") public Date getAccountExpirationDate() { return accountExpirationDate; } public void setAccountExpirationDate(final Date accountExpirationDate) { this.accountExpirationDate = accountExpirationDate; } @Override public boolean isCredentialsNonExpired() { return credentialsExpirationDate == null || credentialsExpirationDate.after(new Date()); } public Date getCredentialsExpirationDate() { return credentialsExpirationDate; } public void setCredentialsExpirationDate(final Date credentialsExpirationDate) { this.credentialsExpirationDate = credentialsExpirationDate; } @Override @JsonIgnore public Collection<? extends GrantedAuthority> getAuthorities() { return AuthorityUtils.createAuthorityList(authorities.toArray(new String[authorities.size()])); } @JsonProperty("authorities") public Collection<String> getAuthoritiesAsStrings() { return authorities; } public void addAuthorities(final String... authorities) { this.authorities.addAll(Arrays.asList(authorities)); } public void addAuthorities(final GrantedAuthority... authorities) { this.authorities.addAll(AuthorityUtils.authorityListToSet(Arrays.asList(authorities))); } public User getUser() { return user; } public void setUser(final User user) { this.user = user; } public long getVersion() { return version; } }