Agenda na správu uživatelů

This commit is contained in:
2014-05-11 00:54:42 +02:00
parent 202825322a
commit 6462fb3806
21 changed files with 447 additions and 74 deletions
@@ -1,10 +1,29 @@
package info.bukova.isspst;
import info.bukova.isspst.data.Role;
public class Constants {
public final static String DEF_ADMIN = "admin";
public final static String DEF_ADMIN_PASSWD = "admin";
public final static String ROLE_USER = "ROLE_USER";
public final static String ROLE_ADMIN = "ROLE_ADMIN";
public final static String ROLES[] = {ROLE_USER, ROLE_ADMIN};
public final static String ROLE_DIRECTOR = "ROLE_DIRECTOR";
public final static String ROLE_MANAGER = "ROLE_MANAGER";
public final static String ROLE_PRINCIPAL = "ROLE_PRINCIPAL";
public final static String ROLE_ACCOUNTANT = "ROLE_ACCOUNTANT";
public final static String ROLE_SUPPLIER = "ROLE_SUPPLIER";
public final static String ROLE_TECHNICIAN = "ROLE_TECHNICIAN";
public final static String ROLE_LEADER = "ROLE_LEADER";
public final static Role ROLES[] = {
new Role(ROLE_ADMIN, "Administrátor"),
new Role(ROLE_DIRECTOR, "Ředitel"),
new Role(ROLE_MANAGER, "Správce"),
new Role(ROLE_PRINCIPAL, "Příkazce"),
new Role(ROLE_ACCOUNTANT, "Účetní"),
new Role(ROLE_SUPPLIER, "Zásobovač"),
new Role(ROLE_TECHNICIAN, "Technik"),
new Role(ROLE_LEADER, "Vedoucí"),
new Role(ROLE_USER, "Uživatel")
};
}
@@ -2,14 +2,15 @@ package info.bukova.isspst;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.RoleService;
import info.bukova.isspst.services.UserService;
import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.services.users.UserService;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
@@ -37,16 +38,10 @@ public class DbInitListener implements ServletContextListener {
}
private void checkRoles() {
Role r = null;
for (String auth : Constants.ROLES)
for (Role role : Constants.ROLES)
{
r = roleService.getRoleByAuthority(auth);
if (r == null) {
r = new Role();
r.setAuthority(auth);
r.setDescription("---");
roleService.add(r);
if (roleService.getRoleByAuthority(role.getAuthority()) == null) {
roleService.add(role);
}
}
}
@@ -62,12 +57,20 @@ public class DbInitListener implements ServletContextListener {
}
if (!adminExists) {
User u = new User();
u.setUsername(Constants.DEF_ADMIN);
u.addAuthority(roleService.getRoleByAuthority(Constants.ROLE_ADMIN));
u.setEnabled(true);
userService.setPassword(u, Constants.DEF_ADMIN_PASSWD);
userService.add(u);
User u = null;
try {
u = (User) userService.loadUserByUsername(Constants.DEF_ADMIN);
u.addAuthority(roleService.getRoleByAuthority(Constants.ROLE_ADMIN));
u.setEnabled(true);
userService.update(u);
} catch(UsernameNotFoundException e) {
u = new User();
u.setUsername(Constants.DEF_ADMIN);
userService.setPassword(u, Constants.DEF_ADMIN_PASSWD);
u.addAuthority(roleService.getRoleByAuthority(Constants.ROLE_ADMIN));
u.setEnabled(true);
userService.add(u);
}
}
}
@@ -1,7 +1,7 @@
package info.bukova.isspst;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.UserService;
import info.bukova.isspst.services.users.UserService;
import java.text.DateFormat;
import java.util.Date;
@@ -0,0 +1,13 @@
package info.bukova.isspst;
public class StringUtils {
public static String nullStr(String str) {
return str == null ? "" : str;
}
public static String not0ToStr(long i) {
return i == 0 ? "" : String.valueOf(i);
}
}
@@ -34,6 +34,15 @@ public class Role implements GrantedAuthority, DataModel {
private Date modified;
@Transient
private boolean valid;
public Role(String authority, String description) {
this.authority = authority;
this.description = description;
}
public Role() {
}
@Override
public String getAuthority() {
@@ -83,5 +92,14 @@ public class Role implements GrantedAuthority, DataModel {
public void setValid(boolean valid) {
this.valid = valid;
}
@Override
public boolean equals(Object o) {
if ((o instanceof Role) && ((Role)o).getId() == this.id) {
return true;
} else {
return false;
}
}
}
@@ -9,9 +9,9 @@ import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MapKeyColumn;
import javax.persistence.OneToMany;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
@@ -36,9 +36,18 @@ public class User implements UserDetails, DataModel {
private String password;
@Column(name="ENABLED")
private boolean enabled;
private String fullName;
@OneToMany(fetch=FetchType.EAGER) @JoinTable(name="USER_ROLE")
@MapKeyColumn(name="ROLE_ID")
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;
@Column(name="PERSONAL_NUMBER")
private String personalNumber;
@Column(name="EMAIL")
private String email;
@Column(name="NOTIFY")
private boolean notify;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="USER_ROLE", joinColumns={@JoinColumn(name="USER_ID")}, inverseJoinColumns={@JoinColumn(name="ROLE_ID")})
private List<Role> authorities;
@Column(name="CREATED")
private Date created;
@@ -139,11 +148,51 @@ public class User implements UserDetails, DataModel {
}
public String getFullName() {
return fullName;
String ret = "";
if (firstName != null && !firstName.isEmpty()) {
ret = firstName + " ";
}
return ret + lastName == null ? "" : lastName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
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 getPersonalNumber() {
return personalNumber;
}
public void setPersonalNumber(String personalNumber) {
this.personalNumber = personalNumber;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public boolean isNotify() {
return notify;
}
public void setNotify(boolean notify) {
this.notify = notify;
}
}
@@ -0,0 +1,57 @@
package info.bukova.isspst.filters;
import info.bukova.isspst.data.User;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.TypeSafeMatcher;
import static info.bukova.isspst.StringUtils.nullStr;
public class UserFilter implements Filter<User> {
private User condUser;
public UserFilter(User condition) {
this.condUser = condition;
}
private static class UserMatcher extends TypeSafeMatcher<User> {
private User condUser;
public UserMatcher(User condition) {
this.condUser = condition;
}
@Override
public void describeTo(Description description) {
description.appendText("user matcher");
}
@Override
public boolean matchesSafely(User item) {
return nullStr(item.getUsername()).toLowerCase().contains(nullStr(condUser.getUsername()).toLowerCase())
&& nullStr(item.getFirstName()).toLowerCase().contains(nullStr(condUser.getFirstName()).toLowerCase())
&& nullStr(item.getLastName()).toLowerCase().contains(nullStr(condUser.getLastName()).toLowerCase())
&& nullStr(item.getPersonalNumber()).toLowerCase().contains(nullStr(condUser.getPersonalNumber()).toLowerCase());
}
@Factory
public UserMatcher matchUser(User cond) {
return new UserMatcher(cond);
}
}
@Override
public TypeSafeMatcher<User> matcher() {
return new UserMatcher(condUser);
}
@Override
public String queryString() {
return null;
}
}
@@ -1,11 +0,0 @@
package info.bukova.isspst.services;
import info.bukova.isspst.data.User;
public interface UserService extends Service<User> {
public void setPassword(User user, String password);
public boolean hasRole(User user, String authority);
public void test();
}
@@ -1,6 +1,7 @@
package info.bukova.isspst.services;
package info.bukova.isspst.services.users;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.services.Service;
public interface RoleService extends Service<Role> {
@@ -1,8 +1,9 @@
package info.bukova.isspst.services;
package info.bukova.isspst.services.users;
import org.springframework.transaction.annotation.Transactional;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.services.AbstractService;
public class RoleServiceImpl extends AbstractService<Role> implements RoleService {
@@ -0,0 +1,14 @@
package info.bukova.isspst.services.users;
import org.springframework.security.core.userdetails.UserDetailsService;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.Service;
public interface UserService extends UserDetailsService, Service<User> {
public void setPassword(User user, String password);
public boolean hasRole(User user, String authority);
public void saveWithPwd(User user, String password);
}
@@ -1,18 +1,16 @@
package info.bukova.isspst.services;
package info.bukova.isspst.services.users;
import org.hibernate.Query;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.transaction.annotation.Transactional;
import info.bukova.isspst.Constants;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.AbstractService;
public class UserServiceImpl extends AbstractService<User> implements UserService, UserDetailsService {
public class UserServiceImpl extends AbstractService<User> implements UserService {
private PasswordEncoder encoder;
@@ -51,9 +49,10 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
}
@Override
@Secured(Constants.ROLE_ADMIN)
public void test() {
System.out.println("pokus secured");
@Transactional
public void saveWithPwd(User user, String password) {
this.setPassword(user, password);
this.update(user);
}
@@ -27,8 +27,7 @@ public class ListViewModel<T extends DataModel> {
private boolean filter = false;
private Window editWin;
private T dataBean;
//private T filterTemplate;
private Filter<T> dataFilter;
private T filterTemplate;
private T editBean;
private List<T> dataList;
private List<T> fullList;
@@ -42,6 +41,7 @@ public class ListViewModel<T extends DataModel> {
protected Service<T> service;
protected Class<T> dataClass;
protected String formZul;
protected Filter<T> dataFilter;
public List<T> getDataList() {
if (dataList == null) {
@@ -60,6 +60,20 @@ public class ListViewModel<T extends DataModel> {
this.dataFilter = dataFilter;
}
public T getFilterTemplate() {
if (filterTemplate == null) {
try {
filterTemplate = dataClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return filterTemplate;
}
public T getDataBean() {
return dataBean;
}
@@ -1,14 +0,0 @@
package info.bukova.isspst.ui;
import org.zkoss.bind.annotation.Init;
import info.bukova.isspst.data.User;
public class UserForm extends FormViewModel<User> {
@Init(superclass = true)
public void init() {
}
}
@@ -0,0 +1,43 @@
package info.bukova.isspst.ui.users;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
public class RoleCheck {
private Role role;
private User user;
private boolean checked;
public RoleCheck(User user, Role role) {
this.user = user;
this.role = role;
if (user.getAuthorities().contains(role)) {
checked = true;
} else {
checked = false;
}
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
if (checked && !user.getAuthorities().contains(role)) {
user.addAuthority(role);
} else {
user.getAuthorities().remove(role);
}
}
}
@@ -0,0 +1,90 @@
package info.bukova.isspst.ui.users;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.ui.FormViewModel;
public class UserForm extends FormViewModel<User> {
@WireVariable
private RoleService roleService;
@WireVariable
private UserService userService;
private String retPasswd = "";
private String password = "";
private UserRoles userRoles;
private boolean loginFree;
@Init(superclass = true)
public void init() {
userRoles = new UserRoles(getDataBean(), roleService.getAll());
loginFree = true;
}
public UserRoles getUserRoles() {
return userRoles;
}
public String getRetPasswd() {
return retPasswd;
}
@NotifyChange({"canSave", "pwMatches"})
public void setRetPasswd(String retPasswd) {
this.retPasswd = retPasswd;
}
public String getPassword() {
return password;
}
@NotifyChange({"canSave", "pwMatches"})
public void setPassword(String password) {
this.password = password;
}
@Command
@NotifyChange({"loginFree", "canSave"})
public void checkLogin() {
try {
userService.loadUserByUsername(getDataBean().getUsername());
loginFree = false;
} catch(UsernameNotFoundException e) {
loginFree = true;
}
}
public boolean isPwMatches() {
return password.equals(retPasswd);
}
public boolean isLoginFree() {
return loginFree || isEdit();
}
public boolean isEdit() {
return getDataBean().getCreated() != null;
}
@Override
protected void doSave() {
if (!password.isEmpty()) {
userService.saveWithPwd(getDataBean(), this.password);
} else {
super.doSave();
}
}
@Override
public boolean isCanSave() {
return password.equals(retPasswd) && isLoginFree() && getDataBean().getUsername() != null && !getDataBean().getUsername().isEmpty();
}
}
@@ -0,0 +1,24 @@
package info.bukova.isspst.ui.users;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import java.util.ArrayList;
import java.util.List;
public class UserRoles {
private List<RoleCheck> roleChecks;
public UserRoles(User user, List<Role> roles) {
roleChecks = new ArrayList<RoleCheck>();
for (Role r : roles) {
roleChecks.add(new RoleCheck(user, r));
}
}
public List<RoleCheck> getRoleChecks() {
return roleChecks;
}
}
@@ -1,10 +1,12 @@
package info.bukova.isspst.ui;
package info.bukova.isspst.ui.users;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.UserService;
import info.bukova.isspst.filters.UserFilter;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.ui.ListViewModel;
public class UsersList extends ListViewModel<User> {
@@ -16,6 +18,7 @@ public class UsersList extends ListViewModel<User> {
service = userService;
dataClass = User.class;
formZul = "userForm.zul";
dataFilter = new UserFilter(getFilterTemplate());
}
}