package com.bstek.bdf2.core.service.impl; import com.bstek.bdf2.core.business.IUser; import com.bstek.bdf2.core.context.ContextHolder; import com.bstek.bdf2.core.model.DefaultUser; import com.bstek.bdf2.core.orm.hibernate.HibernateDao; import com.bstek.bdf2.core.service.IUserService; import com.bstek.dorado.core.resource.ResourceManager; import com.bstek.dorado.core.resource.ResourceManagerUtils; import com.bstek.dorado.data.provider.Criteria; import com.bstek.dorado.data.provider.Page; import org.apache.commons.lang.math.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.security.authentication.encoding.PasswordEncoder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Jacky.gao * @since 2013-1-18 */ @SuppressWarnings("deprecation") public class DefaultUserService extends HibernateDao implements IUserService { private PasswordEncoder passwordEncoder; private static final ResourceManager resourceManager = ResourceManagerUtils .get(DefaultUserService.class); public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { String hql = " from " + DefaultUser.class.getName() + " where username=:username"; Map args = new HashMap<>(); args.put("username", username); List list = this.query(hql, args); if (list.size() == 0) { throw new UsernameNotFoundException("User " + username + " is not exist"); } else { return list.get(0); } } public void loadPageUsers(Page page, String companyId, Criteria criteria) { try { String hql = " from " + DefaultUser.class.getName() + " where companyId=:companyId"; Map args = new HashMap<>(); args.put("companyId", companyId); String countHql = "select count(*) " + hql; this.pagingQuery(page, hql, countHql, args); } catch (Exception e) { } } public Collection loadUsersByDeptId(String deptId) { String hql = " from " + DefaultUser.class.getName() + " where deptId=:deptId"; Map args = new HashMap<>(); args.put("deptId", deptId); return this.query(hql, args); } public void changePassword(String username, String newPassword) { String hql = " update " + DefaultUser.class.getName() + " set password=:newPassword,salt=:salt where username=:username"; Session session = this.getSessionFactory().openSession(); try { Query query = session.createQuery(hql); int salt = RandomUtils.nextInt(1000); query.setString("newPassword", newPassword); query.setString("salt", salt + ""); query.setString("username", username); query.executeUpdate(); } catch (Exception e) { } finally { session.flush(); session.close(); } } public String checkPassword(String username, String password) { DefaultUser user = (DefaultUser) ContextHolder.getLoginUser(); String salt = user.getSalt(); if (!passwordEncoder .isPasswordValid(user.getPassword(), password, salt)) { return resourceManager.getString("bdf2.core/passwordIncorrect"); } else { return null; } } public boolean checkPassword(String username, String password, DefaultUser user) { return passwordEncoder.isPasswordValid(user.getPassword(), password, user.getSalt()); } public IUser newUserInstance(String username) { DefaultUser user = new DefaultUser(); user.setUsername(username); return user; } public void setPasswordEncoder(PasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } public void registerAdministrator(String username, String cname, String ename, String password, String email, String mobile, String companyId) { int salt = RandomUtils.nextInt(1000); password = passwordEncoder.encodePassword(password, salt); DefaultUser defaultUser = new DefaultUser(); defaultUser.setUsername(username); defaultUser.setCname(cname); defaultUser.setPassword(password); defaultUser.setSalt(salt + ""); defaultUser.setEmail(email); defaultUser.setMobile(mobile); defaultUser.setCompanyId(companyId); defaultUser.setAdministrator(false); Session session = this.getSessionFactory().openSession(); try { session.save(defaultUser); } catch (Exception e) { } finally { session.flush(); session.close(); } } @Override public void changeUserInfo(String username, String newPassword, String cname, String mobile) { String hql = " update " + DefaultUser.class.getName() + " set "; Session session = this.getSessionFactory().openSession(); try { int salt = RandomUtils.nextInt(1000); if (StringUtils.isNotEmpty(newPassword)) { hql += " password=:newPassword,salt=:salt "; newPassword = passwordEncoder.encodePassword(newPassword, salt); } if (StringUtils.isNotEmpty(cname)) { hql += " cname=:cname,"; } if (StringUtils.isNotEmpty(mobile)) { hql += " mobile=:mobile,"; } hql += " where username=:username"; Query query = session.createQuery(hql); query.setString("password", newPassword); query.setString("salt", salt + ""); query.setString("cname", cname); query.setString("mobile", mobile); query.setString("username", username); query.executeUpdate(); } catch (Exception e) { } finally { session.flush(); session.close(); } } @Override public DefaultUser loadUser(String username) { String hql = " from " + DefaultUser.class.getName() + " where username=:username"; Map args = new HashMap<>(); args.put("username", username); List list = this.query(hql, args); if (null == list) return null; return list.get(0); } }