package org.dayatang.security.domain; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import java.security.Principal; import java.util.List; /** * 系统用户。系统用户常常对应于一个员工 * Created by yyang on 15/1/13. */ @Entity @DiscriminatorValue("USER") public class User extends Actor implements Principal { //口令 private String password; //口令提示 private String passwordHint; //是否已被锁定。被锁定的用户无法登录,直至解锁 private boolean locked = false; public User() { } public User(String name, String password) { super(name); this.password = password; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPasswordHint() { return passwordHint; } public void setPasswordHint(String passwordHint) { this.passwordHint = passwordHint; } public boolean isLocked() { return locked; } public void setLocked(boolean locked) { this.locked = locked; } @Override public String[] businessKeys() { return new String[] {"name"}; } /** * 锁定员工。被锁定的员工无法登录,直至解锁 */ public void lock() { this.locked = true; save(); } /** * 解锁员工。解锁后的员工可以登录系统 */ public void unlock() { this.locked = false; save(); } public void changePassword(String origPassword, String newPassword) { if (!matchPassword(origPassword)) { throw new PasswordUnmatchException(); } setPassword(newPassword); save(); } /** * 判断口令是否匹配 * @param password * @return */ public boolean matchPassword(String password) { return this.password.equals(password); } public boolean unmatchPassword(String password) { return !matchPassword(password); } /** * 判断系统中是否已存在指定名字的用户 * @param username 要检查的用户名 * @return 如果已存在返回true,否则返回false */ public static boolean existsUsername(String username) { return getByName(username) != null; } /** * 根据ID获取用户。此用户有可能处于失效状态。 * @param id 用户ID * @return 如果找到指定ID的用户则返回该用户,否则返回null */ public static User get(String id) { return get(User.class, id); } /** * 根据用户名获取用户。此用户有可能处于失效状态。 * @param name 用户名 * @return 如果找到指定名字的用户则返回该用户,否则返回null */ public static User getByName(String name) { return getByName(User.class, name); } /** * 列出系统全部用户 * @return 系统的全部用户 */ public static List<User> list() { return findAll(User.class); } /** * 根据提供的用户名和口令验证用户的有效性 * @param username 用户名 * @param password 口令 * @return 如果用户存在,口令匹配,而且没有失效或锁定,则验证成功,返回true;否则验证失败,返回false */ public static boolean authenticate(String username, String password) { User user = getByName(username); if (user == null || user.isDisabled() || user.isLocked()) { return false; } return user.matchPassword(password); } public static User create(String username) { return create(username, ""); } public static User create(String username, String password) { if (existsUsername(username)) { throw new DuplicateUsernameException(); } User user = new User(username, password); user.save(); return user; } @Override public int hashCode() { return new HashCodeBuilder(17, 23).append(getName()).toHashCode(); } @Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof User)) { return false; } User that = (User) other; return new EqualsBuilder().append(this.getName(), that.getName()).isEquals(); } @Override public String toString() { return getName(); } }