package com.stylefeng.guns.modular.system.service.impl;
|
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import com.stylefeng.guns.core.common.constant.JwtConstants;
|
import com.stylefeng.guns.core.datascope.DataScope;
|
import com.stylefeng.guns.core.shiro.ShiroKit;
|
import com.stylefeng.guns.core.shiro.ShiroUser;
|
import com.stylefeng.guns.core.util.JwtTokenUtil;
|
import com.stylefeng.guns.core.util.ToolUtil;
|
import com.stylefeng.guns.modular.system.dao.UserMapper;
|
import com.stylefeng.guns.modular.system.dto.LoginWarpper;
|
import com.stylefeng.guns.modular.system.model.User;
|
import com.stylefeng.guns.modular.system.service.IUserService;
|
import com.stylefeng.guns.modular.system.util.R;
|
import com.stylefeng.guns.modular.system.util.RedisService;
|
import org.apache.shiro.authc.SimpleAuthenticationInfo;
|
import org.apache.shiro.authc.UsernamePasswordToken;
|
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
|
import org.apache.shiro.crypto.hash.Md5Hash;
|
import org.apache.shiro.util.ByteSource;
|
import java.util.concurrent.TimeUnit;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* <p>
|
* 管理员表 服务实现类
|
* </p>
|
*
|
* @author stylefeng123
|
* @since 2018-02-22
|
*/
|
@Service
|
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
|
private String salt = "SA;d5#";
|
|
@Override
|
public int setStatus(Integer userId, int status) {
|
return this.baseMapper.setStatus(userId, status);
|
}
|
|
@Override
|
public int changePwd(Integer userId, String pwd) {
|
return this.baseMapper.changePwd(userId, pwd);
|
}
|
|
@Override
|
public List<Map<String, Object>> selectUsers(DataScope dataScope, String name,String phone, String beginTime, String endTime, Integer deptid,
|
Integer high1,
|
Integer high2,
|
Integer weight1,
|
Integer weight2,
|
String hospital,
|
Integer tag) {
|
return this.baseMapper.selectUsers(dataScope, name,phone, beginTime, endTime, deptid,high1,high2,weight1,weight2,hospital,tag);
|
}
|
|
@Override
|
public int setRoles(Integer userId, String roleIds) {
|
return this.baseMapper.setRoles(userId, roleIds);
|
}
|
|
@Override
|
public User getByAccount(String account) {
|
return this.baseMapper.getByAccount(account);
|
}
|
|
@Override
|
public R<LoginWarpper> driverLogin(String phone, String password) {
|
|
User user = this.baseMapper.getByAccount(phone);
|
if(null == user){
|
return R.fail("账号未注册");
|
}
|
|
if(user.getStatus() == 2){
|
return R.fail("账号已被冻结,请联系管理员");
|
}
|
if(!user.getPassword().equals(ShiroKit.md5(password, user.getSalt()))){
|
// return R.fail("密码错误");
|
}
|
|
// String value = redisUtil.getValue("DEVICE_" + driver.getId());
|
// if(ToolUtil.isNotEmpty(value)){
|
// return ResultUtil.error("当前账户正在车载端登录");
|
// }
|
|
//调用单点登录逻辑
|
// this.singlePointLogin(user.getId());
|
|
String token = this.getToken(user, password);
|
LoginWarpper loginWarpper = new LoginWarpper();
|
loginWarpper.setId(user.getId());
|
loginWarpper.setToken(token);
|
redisService.setCacheObject("Bearer "+token, user.getId(),7 * 24 * 60 * 60L, TimeUnit.SECONDS);
|
// loginWarpper.setAppid(UUIDUtil.getRandomCode());
|
|
// //创建高德猎鹰的终端数据
|
// String tid = gdFalconUtil.createTerminal(phone);
|
// loginWarpper.setServerId(gdFalconUtil.getServerId());
|
// loginWarpper.setTerminalId(tid);
|
return R.ok(loginWarpper);
|
}
|
@Autowired
|
private RedisService redisService;
|
// private void singlePointLogin(Integer id){
|
// //开始验证当前账号是否在别处登录
|
// String value = redisService.getCacheObject("DRIVER_" + id);
|
// if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线(如果是车载端不需要下线)
|
// //开始清除redis中无效的数据
|
// User driver = this.baseMapper.selectById(id);
|
// String key = redisService.getCacheObject("DRIVER_" + driver.getPhone());
|
// redisService.deleteObject(key);//删除个人信息数据
|
// redisService.deleteObject("DRIVER_" + driver.getPhone());//删除后台冻结相关缓存
|
// redisService.deleteObject("DRIVER_" + id);//清除存储的token
|
// }
|
// }
|
|
|
@Override
|
public Integer getUserIdFormRedis(HttpServletRequest request) {
|
String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER);
|
if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
|
requestHeader = requestHeader.substring(requestHeader.indexOf(" ") + 1);
|
String key = null;
|
int length = requestHeader.length();
|
if(length > 32){
|
key = requestHeader.substring(length - 32);
|
}else{
|
key = requestHeader;
|
}
|
String value = redisService.getCacheObject(key);
|
return null != value ? Integer.valueOf(value) : null;
|
}else{
|
return null;
|
}
|
}
|
|
private String getToken(User user, String password){
|
//封装请求账号密码为shiro可验证的token
|
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(user.getPhone(), password.toCharArray());
|
String credentials = user.getPassword();
|
ByteSource credentialsSalt = new Md5Hash(user.getSalt());
|
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
|
new ShiroUser(), credentials, credentialsSalt, "");
|
|
//校验用户账号密码
|
HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
|
md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
|
md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
|
boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
|
usernamePasswordToken, simpleAuthenticationInfo);
|
String s = JwtTokenUtil.generateToken(String.valueOf(user.getId()));
|
// redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(driver.getId()), 7 * 24 * 60 * 60);
|
// redisUtil.setStrValue("DRIVER_" + driver.getPhone(), s.substring(s.length() - 32));
|
// redisUtil.setStrValue("DRIVER_" + driver.getId(), s);
|
return s;
|
}
|
}
|