luodangjia
2024-07-17 69f4408cd37ac8dd18e9f0cdc572401a3b057ea1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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 beginTime, String endTime, Integer deptid,
                                                Integer high1,
                                               Integer high2,
                                                 Integer weight1,
                                                Integer weight2,
                                                String hospital,
                                                 Integer tag) {
        return this.baseMapper.selectUsers(dataScope, name, 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;
    }
}