Service是业务处理的核心,这里就比较简单了,只是调用dao执行数据库的增删改查操作。
然后会有很多问,能不能不要service层了,直接controller调用dao呢?这里明确一下,即使再简单,也需要service层的,因为spring的事务处理一般都是定义在service上面。为了保证框架的完整性、准确性,service层只能加强而不能取消。
这里先写简单的新增、修改、删除、查询列表、查询总数、获取单个六个方法,后续需要的再加,一层层逐步深入,来完成开发框架的构建工作。
SysUserService.java
@Service
public class SysUserService {
@Autowired
private SysUserDao sysUserDao;
@Autowired
private SysResourceDao sysResourceDao;
/**
* 用户新增,先判断用户名是否存在 返回2,账号已存在,返回1操作成功
*
* @param sysUser
* @return
*/
public int add(SysUser sysUser) {
int flag = 0;
SysUser exist = sysUserDao.getByUsername(sysUser.getUsername());
if (exist != null)
flag = 2;
else {
// 设置密码
String password = "123456";
String randomcode = RandomCodeUtil.createRandomCode(6);
Md5SaltUtil md5SaltUtil = new Md5SaltUtil(randomcode);
String md5Pass = md5SaltUtil.encode(password);
sysUser.setPassword(md5Pass);
sysUser.setRandomcode(randomcode);
flag = sysUserDao.add(sysUser);
flag = 1;
}
return flag;
}
public int update(SysUser sysUser) {
int flag = 0;
flag = sysUserDao.update(sysUser);
return flag;
}
public int delete(int id) {
return sysUserDao.delete(id);
}
public SysUser get(int id) {
return sysUserDao.get(id);
}
/**
* 根据username获取用户
*
* @param username
* @return
*/
public SysUser getByUsername(String username) {
return sysUserDao.getByUsername(username);
}
/**
* 用户列表
*
* @param sysUserSearchVO
* @return
*/
public List<SysUser> list(SysUserSearchVO sysUserSearchVO) {
List<SysUser> list = sysUserDao.list(sysUserSearchVO);
return list;
}
/**
* 用户列表总数
*
* @param sysUserSearchVO
* @return
*/
public int count(SysUserSearchVO sysUserSearchVO) {
return sysUserDao.count(sysUserSearchVO);
}
/**
* 修改密码
*
* @param id
* @param oldPass
* @param newPass
* @return
*/
public int updatePass(int id, String oldPass, String newPass) {
int flag = 0;
SysUser getUser = sysUserDao.get(id);
// 判断原密码是否为空,不为空则修改新密码
if (StringUtil.isNotNullOrEmpty(oldPass)) {
Md5SaltUtil md5SaltUtil = new Md5SaltUtil(getUser.getRandomcode());
if (md5SaltUtil.isPasswordValid(getUser.getPassword(), oldPass)) {
String newRandomcode = RandomCodeUtil.createRandomCode(6);
Md5SaltUtil md5SaltUtil12 = new Md5SaltUtil(newRandomcode);
String md5Pass = md5SaltUtil12.encode(newPass);
sysUserDao.updatePass(getUser.getId(), md5Pass, newRandomcode);
flag = 1;
} else {
flag = 2;
}
}
return flag;
}
/**
* 校验密码是否正确
*
* @param sysUser
* @param password
* @return
*/
public boolean checkPass(SysUser sysUser, String password) {
Md5SaltUtil md5SaltUtil = new Md5SaltUtil(sysUser.getRandomcode());
return md5SaltUtil.isPasswordValid(sysUser.getPassword(), password);
}
/**
* 重置密码
*
* @param id
* @return
*/
public int saveResetPass(int id) {
int flag = 0;
String password = "123456";
String randomcode = RandomCodeUtil.createRandomCode(6);
Md5SaltUtil md5SaltUtil = new Md5SaltUtil(randomcode);
String md5Pass = md5SaltUtil.encode(password);
flag = sysUserDao.updatePass(id, md5Pass, randomcode);
return flag;
}
/**
* 修改状态,锁定解锁用户时使用
*
* @param id
* @param status
* @return
*/
public int updateStatus(int id, int status) {
return sysUserDao.updateStatus(id, status);
}
/**
* 所有人员列表,查询日志使用
*
* @return
*/
public List<ComboboxVO> listAllUser() {
return sysUserDao.listAllUser();
}
/**
* 用户列表
*
* @return
*/
public List<SysUser> listAll() {
List<SysUser> list = sysUserDao.listAll();
return list;
}
}
目前写的service都比较简单,只是增删改查,其中SysUserService里面涉及用户密码这一块的生成。目前用户表的密码字段存储方式有以下几种:
1、明文存储:不推荐,不安全,很容易泄露
2、原密码MD5存储:不推荐,容易通过众多生成的MD5,反向猜测原密码
3、MD5加随机数:推荐,由于有salt(盐或随机数)的存在,生成的密码就不容易被反向猜测到了
4、双重MD5加随机数:推荐,两次MD5,更难猜测了
这里选择第三种,相对安全一些,安全也只是在数据不泄露的情况下。很多网站暴露的撞库攻击问题,是因为别的网站用户名和密码泄露了,然后用用户名来试图进入其他网站,举个例子来讲A网站的用户名test,密码123456获得了,黑客试图用test来登录B网站,多数情况下A网站和B网站的密码是一致的,这就是撞库攻击。因为现在网站太多,哪那都需要注册登录,所以用户的账号密码基本也都是一致的(没办法,记不住)。撞库攻击很难防范,可以利用密码的强制安全级别来处理,比如apple就设置密码是强校验形式,必须包含大小写字母和数字,且不能和账号一致。