Search in sources :

Example 1 with Role

use of com.moxi.mogublog.commons.entity.Role in project mogu_blog_v2 by moxi624.

the class AuthorityVerifyAspect method doAround.

@Around(value = "pointcut(authorityVerify)")
public Object doAround(ProceedingJoinPoint joinPoint, AuthorityVerify authorityVerify) throws Throwable {
    ServletRequestAttributes attribute = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attribute.getRequest();
    // 获取请求路径
    String url = request.getRequestURI();
    // 解析出请求者的ID和用户名
    String adminUid = request.getAttribute(SysConf.ADMIN_UID).toString();
    // 管理员能够访问的路径
    String visitUrlStr = redisUtil.get(RedisConf.ADMIN_VISIT_MENU + RedisConf.SEGMENTATION + adminUid);
    LinkedTreeMap<String, String> visitMap = new LinkedTreeMap<>();
    if (StringUtils.isNotEmpty(visitUrlStr)) {
        // 从Redis中获取
        visitMap = (LinkedTreeMap<String, String>) JsonUtils.jsonToMap(visitUrlStr, String.class);
    } else {
        // 查询数据库获取
        Admin admin = adminService.getById(adminUid);
        String roleUid = admin.getRoleUid();
        Role role = roleService.getById(roleUid);
        String caetgoryMenuUids = role.getCategoryMenuUids();
        String[] uids = caetgoryMenuUids.replace("[", "").replace("]", "").replace("\"", "").split(",");
        List<String> categoryMenuUids = new ArrayList<>(Arrays.asList(uids));
        // 这里只需要查询访问的按钮
        QueryWrapper<CategoryMenu> queryWrapper = new QueryWrapper<>();
        queryWrapper.in(SQLConf.UID, categoryMenuUids);
        queryWrapper.eq(SQLConf.MENU_TYPE, EMenuType.BUTTON);
        queryWrapper.eq(SQLConf.STATUS, EStatus.ENABLE);
        List<CategoryMenu> buttonList = categoryMenuService.list(queryWrapper);
        for (CategoryMenu item : buttonList) {
            if (StringUtils.isNotEmpty(item.getUrl())) {
                visitMap.put(item.getUrl(), item.getUrl());
            }
        }
        // 将访问URL存储到Redis中
        redisUtil.setEx(RedisConf.ADMIN_VISIT_MENU + SysConf.REDIS_SEGMENTATION + adminUid, JsonUtils.objectToJson(visitMap), 1, TimeUnit.HOURS);
    }
    // 判断该角色是否能够访问该接口
    if (visitMap.get(url) != null) {
        log.info("用户拥有操作权限,访问的路径: {},拥有的权限接口:{}", url, visitMap.get(url));
        // 执行业务
        return joinPoint.proceed();
    } else {
        log.info("用户不具有操作权限,访问的路径: {}", url);
        return ResultUtil.result(ECode.NO_OPERATION_AUTHORITY, MessageConf.RESTAPI_NO_PRIVILEGE);
    }
}
Also used : LinkedTreeMap(com.google.gson.internal.LinkedTreeMap) QueryWrapper(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) ServletRequestAttributes(org.springframework.web.context.request.ServletRequestAttributes) ArrayList(java.util.ArrayList) Admin(com.moxi.mogublog.commons.entity.Admin) HttpServletRequest(javax.servlet.http.HttpServletRequest) Role(com.moxi.mogublog.commons.entity.Role) CategoryMenu(com.moxi.mogublog.commons.entity.CategoryMenu) Around(org.aspectj.lang.annotation.Around)

Example 2 with Role

use of com.moxi.mogublog.commons.entity.Role in project mogu_blog_v2 by moxi624.

the class LoginRestApi method getMenu.

@ApiOperation(value = "获取当前用户的菜单", notes = "获取当前用户的菜单", response = String.class)
@GetMapping(value = "/getMenu")
public String getMenu(HttpServletRequest request) {
    Collection<CategoryMenu> categoryMenuList = new ArrayList<>();
    Admin admin = adminService.getById(request.getAttribute(SysConf.ADMIN_UID).toString());
    List<String> roleUid = new ArrayList<>();
    roleUid.add(admin.getRoleUid());
    Collection<Role> roleList = roleService.listByIds(roleUid);
    List<String> categoryMenuUids = new ArrayList<>();
    roleList.forEach(item -> {
        String caetgoryMenuUids = item.getCategoryMenuUids();
        String[] uids = caetgoryMenuUids.replace("[", "").replace("]", "").replace("\"", "").split(",");
        categoryMenuUids.addAll(Arrays.asList(uids));
    });
    categoryMenuList = categoryMenuService.listByIds(categoryMenuUids);
    // 从三级级分类中查询出 二级分类
    List<CategoryMenu> buttonList = new ArrayList<>();
    Set<String> secondMenuUidList = new HashSet<>();
    categoryMenuList.forEach(item -> {
        // 查询二级分类
        if (item.getMenuType() == EMenuType.MENU && item.getMenuLevel() == SysConf.TWO) {
            secondMenuUidList.add(item.getUid());
        }
        // 从三级分类中,得到二级分类
        if (item.getMenuType() == EMenuType.BUTTON && StringUtils.isNotEmpty(item.getParentUid())) {
            // 找出二级菜单
            secondMenuUidList.add(item.getParentUid());
            // 找出全部按钮
            buttonList.add(item);
        }
    });
    Collection<CategoryMenu> childCategoryMenuList = new ArrayList<>();
    Collection<CategoryMenu> parentCategoryMenuList = new ArrayList<>();
    List<String> parentCategoryMenuUids = new ArrayList<>();
    if (secondMenuUidList.size() > 0) {
        childCategoryMenuList = categoryMenuService.listByIds(secondMenuUidList);
    }
    childCategoryMenuList.forEach(item -> {
        // 选出所有的二级分类
        if (item.getMenuLevel() == SysConf.TWO) {
            if (StringUtils.isNotEmpty(item.getParentUid())) {
                parentCategoryMenuUids.add(item.getParentUid());
            }
        }
    });
    if (parentCategoryMenuUids.size() > 0) {
        parentCategoryMenuList = categoryMenuService.listByIds(parentCategoryMenuUids);
    }
    List<CategoryMenu> list = new ArrayList<>(parentCategoryMenuList);
    // 对parent进行排序
    Map<String, Object> map = new HashMap<>(Constants.NUM_THREE);
    Collections.sort(list);
    map.put(SysConf.PARENT_LIST, list);
    map.put(SysConf.SON_LIST, childCategoryMenuList);
    map.put(SysConf.BUTTON_LIST, buttonList);
    return ResultUtil.result(SysConf.SUCCESS, map);
}
Also used : OnlineAdmin(com.moxi.mogublog.commons.entity.OnlineAdmin) Admin(com.moxi.mogublog.commons.entity.Admin) Role(com.moxi.mogublog.commons.entity.Role) CategoryMenu(com.moxi.mogublog.commons.entity.CategoryMenu) ApiOperation(io.swagger.annotations.ApiOperation)

Example 3 with Role

use of com.moxi.mogublog.commons.entity.Role in project mogu_blog_v2 by moxi624.

the class LoginRestApi method login.

@ApiOperation(value = "用户登录", notes = "用户登录")
@PostMapping("/login")
public String login(HttpServletRequest request, @ApiParam(name = "username", value = "用户名或邮箱或手机号") @RequestParam(name = "username", required = false) String username, @ApiParam(name = "password", value = "密码") @RequestParam(name = "password", required = false) String password, @ApiParam(name = "isRememberMe", value = "是否记住账号密码") @RequestParam(name = "isRememberMe", required = false, defaultValue = "false") Boolean isRememberMe) {
    if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
        return ResultUtil.result(SysConf.ERROR, "账号或密码不能为空");
    }
    String ip = IpUtils.getIpAddr(request);
    String limitCount = redisUtil.get(RedisConf.LOGIN_LIMIT + RedisConf.SEGMENTATION + ip);
    if (StringUtils.isNotEmpty(limitCount)) {
        Integer tempLimitCount = Integer.valueOf(limitCount);
        if (tempLimitCount >= Constants.NUM_FIVE) {
            return ResultUtil.result(SysConf.ERROR, "密码输错次数过多,已被锁定30分钟");
        }
    }
    Boolean isEmail = CheckUtils.checkEmail(username);
    Boolean isMobile = CheckUtils.checkMobileNumber(username);
    QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
    if (isEmail) {
        queryWrapper.eq(SQLConf.EMAIL, username);
    } else if (isMobile) {
        queryWrapper.eq(SQLConf.MOBILE, username);
    } else {
        queryWrapper.eq(SQLConf.USER_NAME, username);
    }
    queryWrapper.last(SysConf.LIMIT_ONE);
    queryWrapper.eq(SysConf.STATUS, EStatus.ENABLE);
    Admin admin = adminService.getOne(queryWrapper);
    if (admin == null) {
        // 设置错误登录次数
        log.error("该管理员不存在");
        return ResultUtil.result(SysConf.ERROR, String.format(MessageConf.LOGIN_ERROR, setLoginCommit(request)));
    }
    // 对密码进行加盐加密验证,采用SHA-256 + 随机盐【动态加盐】 + 密钥对密码进行加密
    PasswordEncoder encoder = new BCryptPasswordEncoder();
    boolean isPassword = encoder.matches(password, admin.getPassWord());
    if (!isPassword) {
        // 密码错误,返回提示
        log.error("管理员密码错误");
        return ResultUtil.result(SysConf.ERROR, String.format(MessageConf.LOGIN_ERROR, setLoginCommit(request)));
    }
    List<String> roleUids = new ArrayList<>();
    roleUids.add(admin.getRoleUid());
    List<Role> roles = (List<Role>) roleService.listByIds(roleUids);
    if (roles.size() <= 0) {
        return ResultUtil.result(SysConf.ERROR, MessageConf.NO_ROLE);
    }
    String roleNames = null;
    for (Role role : roles) {
        roleNames += (role.getRoleName() + Constants.SYMBOL_COMMA);
    }
    String roleName = roleNames.substring(0, roleNames.length() - 2);
    long expiration = isRememberMe ? isRememberMeExpiresSecond : audience.getExpiresSecond();
    String jwtToken = jwtTokenUtil.createJWT(admin.getUserName(), admin.getUid(), roleName, audience.getClientId(), audience.getName(), expiration * 1000, audience.getBase64Secret());
    String token = tokenHead + jwtToken;
    Map<String, Object> result = new HashMap<>(Constants.NUM_ONE);
    result.put(SysConf.TOKEN, token);
    // 进行登录相关操作
    Integer count = admin.getLoginCount() + 1;
    admin.setLoginCount(count);
    admin.setLastLoginIp(IpUtils.getIpAddr(request));
    admin.setLastLoginTime(new Date());
    admin.updateById();
    // 设置token到validCode,用于记录登录用户
    admin.setValidCode(token);
    // 设置tokenUid,【主要用于换取token令牌,防止token直接暴露到在线用户管理中】
    admin.setTokenUid(StringUtils.getUUID());
    admin.setRole(roles.get(0));
    // 添加在线用户到Redis中【设置过期时间】
    adminService.addOnlineAdmin(admin, expiration);
    return ResultUtil.result(SysConf.SUCCESS, result);
}
Also used : QueryWrapper(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) BCryptPasswordEncoder(org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder) PasswordEncoder(org.springframework.security.crypto.password.PasswordEncoder) OnlineAdmin(com.moxi.mogublog.commons.entity.OnlineAdmin) Admin(com.moxi.mogublog.commons.entity.Admin) Role(com.moxi.mogublog.commons.entity.Role) BCryptPasswordEncoder(org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder) ApiOperation(io.swagger.annotations.ApiOperation)

Example 4 with Role

use of com.moxi.mogublog.commons.entity.Role in project mogu_blog_v2 by moxi624.

the class LoginRestApi method info.

@ApiOperation(value = "用户信息", notes = "用户信息", response = String.class)
@GetMapping(value = "/info")
public String info(HttpServletRequest request, @ApiParam(name = "token", value = "token令牌", required = false) @RequestParam(name = "token", required = false) String token) {
    Map<String, Object> map = new HashMap<>(Constants.NUM_THREE);
    if (request.getAttribute(SysConf.ADMIN_UID) == null) {
        return ResultUtil.result(SysConf.ERROR, "token用户过期");
    }
    Admin admin = adminService.getById(request.getAttribute(SysConf.ADMIN_UID).toString());
    map.put(SysConf.TOKEN, token);
    // 获取图片
    if (StringUtils.isNotEmpty(admin.getAvatar())) {
        String pictureList = this.pictureFeignClient.getPicture(admin.getAvatar(), SysConf.FILE_SEGMENTATION);
        List<String> list = webUtil.getPicture(pictureList);
        if (list.size() > 0) {
            map.put(SysConf.AVATAR, list.get(0));
        } else {
            map.put(SysConf.AVATAR, "https://gitee.com/moxi159753/wx_picture/raw/master/picture/favicon.png");
        }
    }
    List<String> roleUid = new ArrayList<>();
    roleUid.add(admin.getRoleUid());
    Collection<Role> roleList = roleService.listByIds(roleUid);
    map.put(SysConf.ROLES, roleList);
    return ResultUtil.result(SysConf.SUCCESS, map);
}
Also used : Role(com.moxi.mogublog.commons.entity.Role) OnlineAdmin(com.moxi.mogublog.commons.entity.OnlineAdmin) Admin(com.moxi.mogublog.commons.entity.Admin) ApiOperation(io.swagger.annotations.ApiOperation)

Example 5 with Role

use of com.moxi.mogublog.commons.entity.Role in project mogu_blog_v2 by moxi624.

the class SecurityUserDetailsServiceImpl method loadUserByUsername.

/**
 * @param username 浏览器输入的用户名【需要保证用户名的唯一性】
 * @return
 * @throws UsernameNotFoundException
 */
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq(SQLConf.USER_NAME, username);
    queryWrapper.last(SysConf.LIMIT_ONE);
    Admin admin = adminService.getOne(queryWrapper);
    if (admin == null) {
        throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username));
    } else {
        // 查询出角色信息封装到admin中
        List<String> roleNames = new ArrayList<>();
        Role role = roleService.getById(admin.getRoleUid());
        roleNames.add(role.getRoleName());
        admin.setRoleNames(roleNames);
        return SecurityUserFactory.create(admin);
    }
}
Also used : UsernameNotFoundException(org.springframework.security.core.userdetails.UsernameNotFoundException) Role(com.moxi.mogublog.commons.entity.Role) QueryWrapper(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) ArrayList(java.util.ArrayList) Admin(com.moxi.mogublog.commons.entity.Admin)

Aggregations

Role (com.moxi.mogublog.commons.entity.Role)9 Admin (com.moxi.mogublog.commons.entity.Admin)7 QueryWrapper (com.baomidou.mybatisplus.core.conditions.query.QueryWrapper)6 OnlineAdmin (com.moxi.mogublog.commons.entity.OnlineAdmin)4 ApiOperation (io.swagger.annotations.ApiOperation)3 CategoryMenu (com.moxi.mogublog.commons.entity.CategoryMenu)2 ArrayList (java.util.ArrayList)2 Date (java.util.Date)2 IPage (com.baomidou.mybatisplus.core.metadata.IPage)1 Page (com.baomidou.mybatisplus.extension.plugins.pagination.Page)1 LinkedTreeMap (com.google.gson.internal.LinkedTreeMap)1 Storage (com.moxi.mogublog.commons.entity.Storage)1 HttpServletRequest (javax.servlet.http.HttpServletRequest)1 Around (org.aspectj.lang.annotation.Around)1 UsernameNotFoundException (org.springframework.security.core.userdetails.UsernameNotFoundException)1 BCryptPasswordEncoder (org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder)1 PasswordEncoder (org.springframework.security.crypto.password.PasswordEncoder)1 ServletRequestAttributes (org.springframework.web.context.request.ServletRequestAttributes)1