Commit 5ba76bdb authored by 黎博's avatar 黎博

update

parent 67cc15d7
......@@ -10,6 +10,7 @@ import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
......@@ -24,6 +25,7 @@ import java.util.Map;
*/
@Aspect
@Component
@Order(1)
public class HttpLogAspect {
private static final Logger logger = LoggerFactory.getLogger(HttpLogAspect.class);
......
package cn.qg.holmes.aspect;
import cn.qg.holmes.config.annotation.Logical;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.exception.UnauthorizedException;
import cn.qg.holmes.service.auth.TokenService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Set;
@Aspect
@Slf4j
@Component
@Order(3)
public class PermissionAspect {
@Autowired
TokenService tokenService;
@Before("@annotation(cn.qg.holmes.config.annotation.RequiresPermissions)")
public void before(JoinPoint joinPoint) {
log.debug("开始执行权限检查");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String token = request.getHeader("x-auth-token");
if (token == null) {
throw new UnauthorizedException();
}
UserInfoVo userInfoVo = tokenService.getUserInfoFromCache(token);
Set<String> myCodes = userInfoVo.getPermissionCodeList();
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
RequiresPermissions a = methodSignature.getMethod().getAnnotation(RequiresPermissions.class);
String[] perms = a.value();
log.debug("校验权限code: {}", Arrays.toString(perms));
log.debug("用户已有权限: {}", myCodes);
// 对比[要求]的code和[用户实际拥有]的code
if (a.logical() == Logical.AND) {
// 必须包含要求的每个权限
for (String perm: perms) {
if (!myCodes.contains(perm)) {
log.warn("用户缺少权限 code : {}", perm);
throw new UnauthorizedException(); //抛出[权限不足]的异常
}
}
} else {
// 多个权限只需包含其中一种即可
boolean flag = false;
for (String perm : perms) {
if (myCodes.contains(perm)) {
flag = true;
break;
}
}
if (!flag) {
log.warn("用户缺少权限 code= : {} (任意有一种即可)", Arrays.toString(perms));
throw new UnauthorizedException();//抛出[权限不足]的异常
}
}
}
}
package cn.qg.holmes.config.annotation;
public enum Logical {
AND, OR
}
package cn.qg.holmes.config.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
String[] value();
Logical logical() default Logical.AND;
}
package cn.qg.holmes.controller.login;
package cn.qg.holmes.controller.auth;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.mapper.auth.UserMapper;
import cn.qg.holmes.service.ldap.LoginService;
import cn.qg.holmes.service.ldap.TokenService;
import cn.qg.holmes.service.ldap.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import cn.qg.holmes.service.auth.LoginService;
import cn.qg.holmes.service.auth.TokenService;
import cn.qg.holmes.service.auth.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.security.provider.MD5;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
......@@ -40,13 +37,22 @@ public class LoginController {
User user = userService.getUserByUsername(username);
// 用户不存在,则创建新用户
if (user == null) {
user.setUsername(username);
user.setPassword(DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8)));
userService.save(user);
User newUser = new User();
newUser.setUsername(username);
newUser.setPassword(DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8)));
userService.save(newUser);
}
user = userService.getUserByUsername(username);
String token = tokenService.generateToken(user.getId());
Map<String, Object> map = new HashMap<>();
map.put("token", token);
map.put("data", userService.getUserInfoByUsername(username));
return JsonResult.buildSuccessResult(map);
}
@PostMapping("/logout")
public JsonResult logout(String token) {
tokenService.invalidateToken(token);
return JsonResult.buildSuccessResult("登出成功!", true);
}
}
package cn.qg.holmes.controller.auto;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auto.AutoProject;
import cn.qg.holmes.service.auto.AutoProjectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -45,6 +46,7 @@ public class AutoProjectController {
* @param autoProject 项目实体
* @return
*/
@RequiresPermissions("project:add")
@PostMapping("/add")
public JsonResult autoProjectAdd(@RequestBody AutoProject autoProject) {
// 判断项目是否已存在
......@@ -62,6 +64,7 @@ public class AutoProjectController {
* @param autoProject 项目实体
* @return
*/
@RequiresPermissions("project:edit")
@PostMapping("/modify")
public JsonResult autoProjectModify(@RequestBody AutoProject autoProject) {
if (autoProjectService.getById(autoProject.getId()) == null) {
......@@ -75,6 +78,7 @@ public class AutoProjectController {
* 删除项目
* @param projectId 项目id
*/
@RequiresPermissions("project:del")
@GetMapping("/delete")
public JsonResult autoProjectDelete(@RequestParam Integer projectId) {
if (autoProjectService.getById(projectId) == null) {
......
......@@ -6,10 +6,10 @@ import java.util.List;
import java.util.Set;
@Data
public class SessionUserInfo {
public class UserInfoVo {
private Integer userId;
private String username;
private List<Integer> roleIds;
private Set<String> menuList;
private Set<String> permissionList;
// private Set<String> menuList;
private Set<String> permissionCodeList;
}
package cn.qg.holmes.exception;
public class UnauthorizedException extends RuntimeException{
public UnauthorizedException() {
super("用户无此接口权限");
}
}
package cn.qg.holmes.service.ldap;
package cn.qg.holmes.service.auth;
public interface LdapService {
......
package cn.qg.holmes.service.ldap;
package cn.qg.holmes.service.auth;
public interface LoginService {
......
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.Permission;
import com.baomidou.mybatisplus.extension.service.IService;
public interface PermissionService extends IService<Permission> {
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.RolePermission;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Set;
public interface RolePermissionService extends IService<RolePermission> {
Set<String> getPermissionSetForRoleIds(List<Integer> roleIds);
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.Role;
import com.baomidou.mybatisplus.extension.service.IService;
public interface RoleService extends IService<Role> {
}
package cn.qg.holmes.service.ldap;
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.SessionUserInfo;
import cn.qg.holmes.entity.auth.UserInfoVo;
public interface TokenService {
String generateToken(Integer userId);
SessionUserInfo getUserInfoFromCache(String token);
UserInfoVo getUserInfoFromCache(String token);
void invalidateToken(String token);
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.UserRole;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface UserRoleService extends IService<UserRole> {
List<Integer> getRoleIdsByUserId(Integer userId);
}
package cn.qg.holmes.service.ldap;
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserInfoVo;
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
User getUserByUsername(String username);
UserInfoVo getUserInfoByUsername(String username);
}
package cn.qg.holmes.service.ldap.impl;
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.service.ldap.LdapService;
import cn.qg.holmes.service.auth.LdapService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;
......
package cn.qg.holmes.service.ldap.impl;
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.service.ldap.LdapService;
import cn.qg.holmes.service.ldap.LoginService;
import cn.qg.holmes.service.auth.LdapService;
import cn.qg.holmes.service.auth.LoginService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.Permission;
import cn.qg.holmes.mapper.auth.PermissionMapper;
import cn.qg.holmes.service.auth.PermissionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.RolePermission;
import cn.qg.holmes.mapper.auth.PermissionMapper;
import cn.qg.holmes.mapper.auth.RolePermissionMapper;
import cn.qg.holmes.service.auth.RolePermissionService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Service
public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper, RolePermission> implements RolePermissionService {
@Autowired
RolePermissionMapper rolePermissionMapper;
@Autowired
PermissionMapper permissionMapper;
@Override
public Set<String> getPermissionSetForRoleIds(List<Integer> roleIds) {
Set<String> permissionCodeSet = new HashSet<>();
for (Integer roleId: roleIds) {
QueryWrapper<RolePermission> rolePermissionQueryWrapper = new QueryWrapper<>();
rolePermissionQueryWrapper.eq("role_id", roleId);
List<RolePermission> rolePermissionList = rolePermissionMapper.selectList(rolePermissionQueryWrapper);
rolePermissionList.forEach(rolePermission -> {
permissionCodeSet.add(permissionMapper.selectById(rolePermission.getPermissionId()).getPermissionCode());
});
}
return permissionCodeSet;
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.Role;
import cn.qg.holmes.mapper.auth.RoleMapper;
import cn.qg.holmes.service.auth.RoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
}
package cn.qg.holmes.service.ldap.impl;
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.SessionUserInfo;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.mapper.auth.UserMapper;
import cn.qg.holmes.service.ldap.TokenService;
import cn.qg.holmes.service.auth.TokenService;
import cn.qg.holmes.service.auth.UserService;
import cn.qg.holmes.utils.RedisUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.naming.ContextNotEmptyException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.*;
@Slf4j
@Service
......@@ -27,6 +27,9 @@ public class TokenServiceImpl implements TokenService {
@Autowired
UserMapper userMapper;
@Autowired
UserService userService;
/**
* 生成token并存放到redis
* @param userId 用户id
......@@ -35,12 +38,10 @@ public class TokenServiceImpl implements TokenService {
@Override
public String generateToken(Integer userId) {
String token = UUID.randomUUID().toString().replace("-", "").substring(0, 20);
Map<String, Object> map = new HashMap<>();
User user = userMapper.selectById(userId);
map.put("userId", userId);
map.put("username", user.getUsername());
UserInfoVo userInfoVo = userService.getUserInfoByUsername(user.getUsername());
//设置用户信息缓存
redisUtils.set(TOKEN_PREFIX + token, map);
redisUtils.set(TOKEN_PREFIX + token, userInfoVo);
return token;
}
......@@ -50,11 +51,27 @@ public class TokenServiceImpl implements TokenService {
* @return
*/
@Override
public SessionUserInfo getUserInfoFromCache(String token) {
public UserInfoVo getUserInfoFromCache(String token) {
if (StringUtils.isEmpty(token)) {
return null;
}
SessionUserInfo sessionUserInfo = (SessionUserInfo) redisUtils.get(token);
return sessionUserInfo;
UserInfoVo userInfoVo = new UserInfoVo();
Map redisValue = (Map) redisUtils.get(TOKEN_PREFIX + token);
userInfoVo.setUserId((Integer) redisValue.get("userId"));
userInfoVo.setUsername(redisValue.get("username").toString());
userInfoVo.setRoleIds((List<Integer>) redisValue.get("roleIds"));
Set<String> permissionCodeSet = new HashSet<>();
List<String> permissionCodeList = (List<String>) redisValue.get("permissionCodeList");
permissionCodeList.forEach(permissionCode -> {
permissionCodeSet.add(permissionCode);
});
userInfoVo.setPermissionCodeList(permissionCodeSet);
return userInfoVo;
}
@Override
public void invalidateToken(String token) {
redisUtils.del(TOKEN_PREFIX + token);
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.UserRole;
import cn.qg.holmes.mapper.auth.UserRoleMapper;
import cn.qg.holmes.service.auth.UserRoleService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole> implements UserRoleService {
@Autowired
UserRoleMapper userRoleMapper;
@Override
public List<Integer> getRoleIdsByUserId(Integer userId) {
QueryWrapper<UserRole> userRoleQueryWrapper = new QueryWrapper<>();
userRoleQueryWrapper.eq("user_id", userId);
List<UserRole> userRoleList = userRoleMapper.selectList(userRoleQueryWrapper);
List<Integer> roleIds = new ArrayList<>();
userRoleList.forEach(userRole -> {
roleIds.add(userRole.getRoleId());
});
return roleIds;
}
}
package cn.qg.holmes.service.ldap.impl;
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.mapper.auth.UserMapper;
import cn.qg.holmes.service.ldap.UserService;
import cn.qg.holmes.mapper.auth.UserRoleMapper;
import cn.qg.holmes.service.auth.RolePermissionService;
import cn.qg.holmes.service.auth.UserRoleService;
import cn.qg.holmes.service.auth.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
UserMapper userMapper;
@Autowired
UserRoleService userRoleService;
@Autowired
RolePermissionService rolePermissionService;
@Override
public User getUserByUsername(String username) {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("username", username);
return userMapper.selectOne(userQueryWrapper);
}
@Override
public UserInfoVo getUserInfoByUsername(String username) {
UserInfoVo userInfoVo = new UserInfoVo();
userInfoVo.setUsername(username);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("username", username);
User user = userMapper.selectOne(userQueryWrapper);
return user;
userInfoVo.setUserId(user.getId());
List<Integer> roleIds = userRoleService.getRoleIdsByUserId(user.getId());
userInfoVo.setRoleIds(roleIds);
Set<String> permissionCodeSet = rolePermissionService.getPermissionSetForRoleIds(roleIds);
userInfoVo.setPermissionCodeList(permissionCodeSet);
return userInfoVo;
}
}
<?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="cn.qg.holmes.mapper.auth.UserMapper">
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment