UserController.java 12.0 KB
package com.tianbo.warehouse.controller;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import com.tianbo.warehouse.annotation.LogAnnotation;
import com.tianbo.warehouse.annotation.RequestRequire;
import com.tianbo.warehouse.annotation.UserPasswordSM3;
import com.tianbo.warehouse.controller.response.ResultJson;
import com.tianbo.warehouse.model.Token;
import com.tianbo.warehouse.model.USERS;
import com.tianbo.warehouse.model.UserRole;
import com.tianbo.warehouse.security.CustomUserDetailService;
import com.tianbo.warehouse.service.UserService;
import com.tianbo.warehouse.service.validated.InsertUser;
import com.tianbo.warehouse.service.validated.UpdateUser;
import com.tianbo.warehouse.util.RedisUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

@RestController
@Slf4j
@RequestMapping("/user")
@Api("swaggerDemoController相关的api")
public class UserController {

    @Autowired
    UserService userService;

    @Autowired
    CustomUserDetailService userDetailService;

    @Autowired
    RedisUtils redisUtils;


    @ApiOperation(value = "查询用户列表及信息", notes = "查询用户列表及单个用户信息")
    @ApiImplicitParams({@ApiImplicitParam(name = "pageNum", value = "分页-当前页", required = false, dataType = "int",defaultValue = "1"),
            @ApiImplicitParam(name = "pageSize", value = "分页-每页显示多少条", required = false, dataType = "int",defaultValue = "5")})
    @RequestRequire
    @GetMapping("/list")
    public ResultJson<PageInfo> list(@RequestParam(value = "pageNum",required = false,defaultValue = "1")
                                        int pageNum,
                                @RequestParam(value = "pageSize",required = false,defaultValue = "5")
                                        int pageSize,
                                @RequestParam(value = "userName",required = false) String username,
                                @RequestParam(value = "realName",required = false) String realname,
                                @RequestParam(value = "companyId",required = false) Integer companyId,
                                @RequestParam(value = "userStatus",required = false) Integer userStatus
                                     )
    {
        USERS users = new USERS();
        users.setUsername(username);
        users.setRealname(realname);
        users.setUserStatus(userStatus);
        PageInfo<USERS> usersPageInfo = userService.selectAllUser(pageNum,pageSize,  users);
        return new ResultJson("200","success",usersPageInfo);
    }

    public String getCurrentUser(){

        //通过session获取当前登录的用户信息
        UserDetails userDetails =(UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        return userDetails.getUsername();
    }
    @ApiOperation(value = "更新用户信息", notes = "更新用户信息除了用户密码")
    @LogAnnotation(moduleName = "用户管理",operate = "用户编辑")
    @PostMapping("/edit")
    public ResultJson updateUserById(@Validated(UpdateUser.class) @RequestBody USERS user){
        int i = userService.updateByPrimaryKeySelective(user);
        user.setPassword(null);
        ResultJson resultJson = new ResultJson();
        return i==1 ? new ResultJson("200","success") :new ResultJson("500","update faild");

    }

    @LogAnnotation(moduleName = "用户管理",operate = "用户密码修改")
    @UserPasswordSM3
    @PostMapping("/password")
    public ResultJson updateUserPassById(@RequestBody USERS user){
        int i = userService.updateByPrimaryKeySelective(user);
        return i==1 ? new ResultJson("200","success") :new ResultJson("500","update faild");
    }

    @UserPasswordSM3
    @LogAnnotation(moduleName = "用户管理",operate = "用户添加")
    @PostMapping("/add")
    public ResultJson addUser(@RequestBody @Validated(InsertUser.class) USERS user, HttpServletRequest request, HttpServletResponse response, BindingResult bindingResult){

        if (bindingResult.hasErrors()){
           String s =  bindingResult.toString();
        }

        int i = userService.insertSelective(user);
        return i>0 ? new ResultJson("200","新建账户成功") :new ResultJson("500","insert faild");

    }

    @LogAnnotation(moduleName = "用户管理",operate = "用户删除")
    @PostMapping("/del")
    public ResultJson delUser(@RequestBody USERS user,HttpServletRequest request,HttpServletResponse response){
        //String username = getusername();
        int i = userService.deleteByPrimaryKey(user.getUserId());
        ResultJson resultJson = new ResultJson();
        return i==1 ? new ResultJson("200","删除账户成功") :new ResultJson("500","delete faild");
    }

    @PostMapping("/roleset")
    public ResultJson roleSet(@RequestBody Map<String,Object> map,HttpServletRequest request,HttpServletResponse respons){
        Integer id = (Integer) map.get("userId");
        List<Integer> roles = (List<Integer>) map.get("roleIds");
        UserRole userRole = new UserRole();
        userRole.setUserId(id);
        userRole.setRoleIds(roles);
        int i =  userService.setUserRole(userRole);
        return i==1 ? new ResultJson("200","设置角色成功") :new ResultJson("500","设置角色失败");
    }

    /**
     * 刷新redis权限缓存
     */
    @ApiOperation(value = "更新用户权限缓存", notes = "重新生成用户的信息到redis")
    @PostMapping("/resetToken")
    public ResultJson resetToken(HttpServletRequest request,HttpServletResponse respons) {
        /**
         * 更新目标用户的权限缓存
         */
        String authHeader = request.getHeader("Authorization");
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            final String authToken = authHeader.substring("Bearer ".length());
            try {
                String userJson = redisUtils.get(authToken);
                if (userJson != null) {
                    USERS u = JSON.parseObject(userJson, USERS.class);
                    String username = u.getUsername();

//                  String username = JwtTokenUtil.parseToken(authToken);
                    if (username != null) {
                        UserDetails userDetails = userDetailService.loadUserByUsername(username);
                        if (userDetails != null) {
                            String json = JSON.toJSONString(userDetails);
                            redisUtils.set(authToken, json, 3600 * 24 * 7);
                            return new ResultJson("200", "缓存更新成功");
                        }
                    }
                }
            }catch (Exception e){
                log.error(e.toString());
                return new ResultJson("500","缓存更新失败");
            }
        }
        return new ResultJson("500","缓存更新失败");
    }

    @ApiOperation(value = "禁用用户", notes = "禁用用户并踢掉已登录的用户,以及启用用户")
    @LogAnnotation(moduleName = "用户锁定",operate = "用户锁定")
    @PostMapping("/lock")
    public ResultJson lockUserById(@Validated(UpdateUser.class) @RequestBody USERS user){
        USERS lockuser = new USERS();
        lockuser.setUserId(user.getUserId());
        lockuser.setState(user.getState());

        int i = userService.updateByPrimaryKeySelective(lockuser);
        //删除用户token缓存 及时生效锁定账号
        if (i>0){
            String userTokenStr = redisUtils.get(Token.USER_TOKEN_KEY + user.getUsername());
            if (StringUtils.isNotEmpty(userTokenStr)){
                redisUtils.del(userTokenStr);
                redisUtils.del(Token.USER_TOKEN_KEY + user.getUsername());
            }
        }
        return i==1 ? new ResultJson("200","success") :new ResultJson("500","lock user faild");

    }

    @GetMapping("/getUserInfoByToken")
    public ResultJson get(
            @RequestHeader("Authorization") String token
    ){
        USERS userInfo = userService.getUserInfoByToken(token);
        return new ResultJson("200","get user info success",userInfo);
    }

    @ApiOperation(value = "给用户创建不时效的长访问token", notes = "给用户创建不时效的长访问token,方便用户进行API接口式的对接")
    @PostMapping("creatAuthToken")
    public ResultJson creatAuthToken(@RequestBody() USERS user){
        if (user != null && StringUtils.isNotEmpty(user.getUsername())) {
            UserDetails userDetails = userDetailService.loadUserByUsername(user.getUsername());
            if (userDetails != null) {
                String UUID_TOKEN = "sk-"+UUID.randomUUID().toString().replace("-","");
                String tokenPrefix = "auth:api:" + user.getUsername() + ":";
                String AUTH_TOKEN_KEY_NAME =  tokenPrefix + UUID_TOKEN;
                // 存储token值 方便后面查询及清理删除
                redisUtils.set(tokenPrefix + "token",UUID_TOKEN);

                String json = JSON.toJSONString(userDetails);
                redisUtils.set(AUTH_TOKEN_KEY_NAME, json );
                return new ResultJson("200", "token设置成功",AUTH_TOKEN_KEY_NAME);
            }
        }
        return new ResultJson("500","token设置失败");
    }

    /**
     * 查看已配置用户token的接口.
     *
     * @param username 用户名
     * @return token值列表或错误信息
     */
    @ApiOperation(value = "查看已配置用户token的接口", notes = "查看已配置用户token的接口,方便后续清理及查询")
    @GetMapping("viewAuthToken")
    public ResultJson viewAuthToken(@RequestParam String username) {
        if (StringUtils.isNotEmpty(username)) {
            // 构造搜索的前缀,考虑到多个token可能与一个用户相关联
            String keyName = "auth:api:" + username + ":token" ;

            if (keyName != null && !keyName.isEmpty()) {
                // 将匹配到的key值转换为token列表返回给客户端
                String token = redisUtils.get(keyName);
                return new ResultJson("200", "找到" + username + "的token", token);
            }
        }

        // 如果未找到任何与username相关的key,返回错误信息
        return new ResultJson("404", "没有找到" + username + "的token");
    }

    @ApiOperation(value = "删除用户的长访问token", notes = "根据username删除对应的用户token")
    @PostMapping("deleteAuthToken")
    public ResultJson deleteAuthToken(@RequestParam String username){
        if (StringUtils.isNotEmpty(username)) {
            // 构建token前缀
            String tokenPrefix = "auth:api:" + username + ":";

            // 尝试获取存储的token值,如果存在则删除
            Object tokenObject = redisUtils.get(tokenPrefix + "token");
            if (tokenObject != null) {
                String UUID_TOKEN = (String) tokenObject;
                String AUTH_TOKEN_KEY_NAME =  tokenPrefix + UUID_TOKEN;

                // 删除相关的token键
                redisUtils.del(tokenPrefix + "token");
                redisUtils.del(AUTH_TOKEN_KEY_NAME);

                return new ResultJson("200", "token删除成功", username);
            }
        }

        return new ResultJson("500","删除token失败,可能用户未登录或无对应token");
    }
}