统一身份认证系统之用户登录的实现
新建登录日志po类【SysLoginLog.java】
package com.dc.pojo;
import com.wordnik.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
* @title:<h3> 登录日志po类 <h3>
* @author: Enzo
* @date: 2018-11-12 10:40
* @params
* @return
**/
public class SysLoginLog implements Serializable {
@ApiModelProperty(value = "登录日志主键id")
private int login_log_id;
@ApiModelProperty(value = " 用户id")
private int user_id;
@ApiModelProperty(value = " 用户提交的账号")
private String user_account;
@ApiModelProperty(value = " 用户提交的密码")
private String user_password;
@ApiModelProperty(value = " 用户姓名")
private String user_name;
@ApiModelProperty(value = " 登陆时间 ")
private Date login_date;
@ApiModelProperty(value = " 登出时间")
private Date loginout_date;
@ApiModelProperty(value = " 请求的ip地址")
private String request_ip;
@ApiModelProperty(value = " 登陆状态[1成功,2帐号不存在,3密码错误,4帐号未激活,5帐号被锁定]")
private int state;
@ApiModelProperty(value = " 登陆类型[0pc]")
private int type;
@ApiModelProperty(value = " 设备imei号")
private String imei;
@ApiModelProperty(value = " 手机型号")
private String model_number;
@ApiModelProperty(value = " 版本号 ")
private String version_num;
@ApiModelProperty(value = " 登出类型[0,1注销]")
private int loginout_type;
@ApiModelProperty(value = " 会话sessionId")
private String session_id;
public int getLogin_log_id() {
return login_log_id;
}
public void setLogin_log_id(int login_log_id) {
this.login_log_id = login_log_id;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUser_account() {
return user_account;
}
public void setUser_account(String user_account) {
this.user_account = user_account;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public Date getLogin_date() {
return login_date;
}
public void setLogin_date(Date login_date) {
this.login_date = login_date;
}
public Date getLoginout_date() {
return loginout_date;
}
public void setLoginout_date(Date loginout_date) {
this.loginout_date = loginout_date;
}
public String getRequest_ip() {
return request_ip;
}
public void setRequest_ip(String request_ip) {
this.request_ip = request_ip;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
public String getModel_number() {
return model_number;
}
public void setModel_number(String model_number) {
this.model_number = model_number;
}
public String getVersion_num() {
return version_num;
}
public void setVersion_num(String version_num) {
this.version_num = version_num;
}
public int getLoginout_type() {
return loginout_type;
}
public void setLoginout_type(int loginOut_type) {
this.loginout_type = loginOut_type;
}
public String getSession_id() {
return session_id;
}
public void setSession_id(String session_id) {
this.session_id = session_id;
}
}
在【SysUserDao.java】中添加根据用户名查询用户信息接口
SysUser selectUserByAccount(@Param("account") String account);
在【SysUserMapper.xml】中添加根据用户名查询用户信息sql
<select id="selectUserByAccount" parameterType="string" resultType="com.dc.pojo.SysUser">
SELECT * from t_sys_user where is_deleted=0 and account=#{account}
</select>
新增登录日志Dao接口【SysLoginLog.java】
package com.dc.mapper;
import com.dc.pojo.SysLoginLog;
public interface SysLoginLogDao {
int insert(SysLoginLog loginLog);
}
新增登录日志Mapper.xml【SysLoginLogMapper.xml】
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dc.mapper.SysLoginLogDao">
<insert id="insert" parameterType="com.dc.pojo.SysLoginLog"
useGeneratedKeys="true" keyProperty="login_log_id">
insert into t_sys_loginlog
(user_id,user_account,user_password,user_name,login_date,request_ip,state,type,imei,model_number,session_id,version_num)
values
(#{user_id},#{user_account},#{user_password},#{user_name},now(),#{request_ip},#{state},#{type},#{imei},#{model_number},#{session_id},#{version_num})
</insert>
</mapper>
新增登录业务层接口【LoginService.java】
package com.dc.service;
import com.dc.base.pojo.BaseModel;
import com.dc.pojo.SysLoginLog;
public interface LoginService {
void login(SysLoginLog loginLog, BaseModel baseModel)throws Exception;
}
新增登录业务层接口实现【LoginServiceImpl.java】
package com.dc.service.impl;
import com.dc.base.pojo.BaseModel;
import com.dc.mapper.SysLoginLogDao;
import com.dc.mapper.SysUserDao;
import com.dc.pojo.SysLoginLog;
import com.dc.pojo.SysUser;
import com.dc.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author Enzo
* @Description TODO
* @date 2018-11-12 15:24
*/
@Service
public class LoginServiceImpl implements LoginService {
@Autowired
private SysUserDao userDao;
@Autowired
private SysLoginLogDao loginLogDao;
/**
* @return void
* @title:<h3> 登录 <h3>
* @author: Enzo
* @date: 2018-11-12 15:24
* @params [loginLog, baseModel]
**/
public void login(SysLoginLog loginLog, BaseModel baseModel) throws Exception {
//1.根据用户名查询用户信息
SysUser user = userDao.selectUserByAccount(loginLog.getUser_account());
//2.判断帐号是否存在
if (user == null) {//如果用户信息不存在,说明帐号不存在
baseModel.setResultCode(1);
baseModel.setMessage("帐号或密码错误");
loginLog.setState(2);
} else {//说明存在帐号
//3.验证帐号是否激活
if (user.getState() == 1) {//说启用
//4.判断密码是否正确
if (user.getPassword().equals((loginLog.getUser_password()))) {//如果密码正确,登录成功
loginLog.setState(1);
baseModel.setResultCode(0);
baseModel.setMessage("登录成功");
user.setPassword(null);//密码等敏感数据不返回
baseModel.setData(user);
loginLog.setUser_id(user.getUser_id());
loginLog.setUser_name(user.getName());
loginLog.setUser_password(null);//登录成功的密码不保存在登录日志
} else {//帐号或密码错误
baseModel.setResultCode(1);
baseModel.setMessage("帐号或密码错误");
loginLog.setState(3);
}
} else {//没启用
loginLog.setState(4);
baseModel.setResultCode(1);
baseModel.setMessage("帐号未激活,请联系管理员");
loginLog.setUser_password(null);//未激活的密码不保存在登录日志
}
}
//5.不管登录成功否,记录登录日志
int count = loginLogDao.insert(loginLog);
if (count == 0) {//新增登录日志失败
baseModel.setResultCode(1);
baseModel.setMessage("新增登录日志失败");
}
}
}
新增登录控制器【LoginController.java】
package com.dc.controller;
import com.dc.base.contants.BaseContants;
import com.dc.base.contants.ErrorMesgEnum;
import com.dc.base.controller.BaseController;
import com.dc.base.pojo.BaseModel;
import com.dc.base.pojo.BusinessException;
import com.dc.pojo.SysLoginLog;
import com.dc.service.LoginService;
import com.wordnik.swagger.annotations.ApiImplicitParam;
import com.wordnik.swagger.annotations.ApiImplicitParams;
import com.wordnik.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author Enzo
* @Description TODO
* @date 2018-11-12 15:39
*/
@Controller
@ResponseBody
@RequestMapping("index")
public class LoginController extends BaseController {
@Autowired
LoginService loginService;
/**
* @return com.dc.base.pojo.BaseModel
* @title:<h3> 用户登录 <h3>
* @author: Enzo
* @date: 2018-11-12 15:56
* @params [loginLog, baseModel]
**/
@ApiOperation(value = "登录", notes = "登录", httpMethod = "POST")
@ApiImplicitParams({
@ApiImplicitParam(name = "user_account", value = "帐号"
, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "user_password", value = "密码"
, dataType = "String", paramType = "query")
})
@RequestMapping(value = "login", method = RequestMethod.POST)
public BaseModel login(SysLoginLog loginLog, BaseModel baseModel) throws Exception {
if (loginLog == null) {
throw new BusinessException(ErrorMesgEnum.NO_LOGIN.LOGIN_NULL_USER);
} else if (loginLog.getUser_account() == null || "".equals(loginLog.getUser_account()) || loginLog.getUser_password() == null || "".equals(loginLog.getUser_password())) {
throw new BusinessException(ErrorMesgEnum.NO_LOGIN.LOGIN_NULL_USER);
} else {
loginLog.setType(0);//标志pc登录
loginLog.setRequest_ip(request.getRemoteAddr());
loginLog.setModel_number(request.getHeader("User-Agent"));
loginLog.setSession_id(session.getId());
loginService.login(loginLog, baseModel);
session.setAttribute(BaseContants.LOGIN_USER, baseModel.getData());
}
return baseModel;
}
}