Skip to content

Commit

Permalink
完成角色权限绑定接口
Browse files Browse the repository at this point in the history
  • Loading branch information
LiuYuYang01 committed Jan 25, 2025
1 parent 5e50fbb commit d23a018
Show file tree
Hide file tree
Showing 11 changed files with 141 additions and 40 deletions.
68 changes: 47 additions & 21 deletions blog/src/main/java/liuyuyang/net/aspect/PremNameAspect.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@
import liuyuyang.net.annotation.PremName;
import liuyuyang.net.execption.CustomException;
import liuyuyang.net.mapper.PermissionMapper;
import liuyuyang.net.mapper.RolePermissionMapper;
import liuyuyang.net.model.Permission;
import liuyuyang.net.model.RolePermission;
import liuyuyang.net.properties.JwtProperties;
import liuyuyang.net.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
Expand All @@ -23,6 +26,8 @@
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@Slf4j
@Aspect
Expand All @@ -32,6 +37,8 @@ public class PremNameAspect {
private JwtProperties jwtProperties;
@Resource
private PermissionMapper permissionMapper;
@Autowired
private RolePermissionMapper rolePermissionMapper;

// 定义切点,支持类和方法上的注解
@Pointcut("@within(liuyuyang.net.annotation.PremName) || @annotation(liuyuyang.net.annotation.PremName)")
Expand All @@ -40,57 +47,76 @@ private void cut() {

@Before("cut()")
public void before(JoinPoint joinPoint) {
PremName name = getMethodAnnotation(joinPoint);
// 获取方法上的 @PremName 注解
Optional<PremName> nameOpt = Optional.of(getMethodAnnotation(joinPoint).get());

if (name != null) {
// 如果注解存在,进行权限验证
nameOpt.ifPresent(name -> {
String prem = name.value();
log.info("权限名称:{}", prem);

// 获取当前请求的上下文
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
HttpServletResponse response = attributes.getResponse();

// 获取token
// 获取请求头中的 token
String token = request.getHeader("Authorization");
System.out.println("Authorization Header: " + token);
log.debug("Authorization Header: {}", token);

// 去掉 Bearer 前缀
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
}

Map<String, Object> role;

// 解析token
// 解析 token 并获取角色信息
try {
Claims claims = JwtUtils.parseJWT(jwtProperties.getSecretKey(), token);
System.out.println(claims);
role = (Map<String, Object>) claims.get("role");

// 通过角色查询每个权限
LambdaQueryWrapper<Permission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Permission::getRoleId, role.get("id")).eq(Permission::getName, prem);
List<Permission> permissions = permissionMapper.selectList(lambdaQueryWrapper);

if(permissions == null || permissions.isEmpty()) throw new CustomException("暂无权限,请联系管理员");
// 查询指定角色的权限
LambdaQueryWrapper<RolePermission> roleLambdaQueryWrapper = new LambdaQueryWrapper<>();
roleLambdaQueryWrapper.eq(RolePermission::getRoleId, role.get("id"));
List<RolePermission> rolePermission = rolePermissionMapper.selectList(roleLambdaQueryWrapper);

// 收集所有权限ID
List<Integer> permissionIds = rolePermission.stream()
.map(RolePermission::getPermissionId)
.collect(Collectors.toList());

// 如果没有权限ID,抛出异常
if (permissionIds.isEmpty()) {
throw new CustomException("暂无权限,请联系管理员");
}

// 查询所有权限
LambdaQueryWrapper<Permission> permissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
permissionLambdaQueryWrapper.in(Permission::getId, permissionIds);
List<Permission> permissions = permissionMapper.selectList(permissionLambdaQueryWrapper);

// 如果权限列表为空,抛出异常
if (permissions == null || permissions.isEmpty()) {
throw new CustomException("暂无权限,请联系管理员");
}
} catch (Exception e) {
e.printStackTrace();
// 记录错误日志并抛出自定义异常
log.error("Token解析或权限查询出错", e);
response.setStatus(401);
throw new CustomException(401, e.getMessage());
}

log.info("角色ID:{}", role.get("id"));
}
}
});
}

// 获取当前方法上的 @PermName 注解
private PremName getMethodAnnotation(JoinPoint joinPoint) {
Method method = getCurrentMethod(joinPoint);
if (method != null) {
return method.getAnnotation(PremName.class);
}
return null;
// 获取当前方法上的 @PremName 注解
private Optional<PremName> getMethodAnnotation(JoinPoint joinPoint) {
return Optional.ofNullable(getCurrentMethod(joinPoint))
.map(method -> method.getAnnotation(PremName.class));
}

// 获取当前执行的方法对象
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import io.swagger.annotations.ApiOperation;
import liuyuyang.net.annotation.CheckRole;
import liuyuyang.net.annotation.PremName;
import liuyuyang.net.dto.role.BindRouteAndPermission;
import liuyuyang.net.model.Permission;
import liuyuyang.net.model.Role;
import liuyuyang.net.model.Route;
Expand Down Expand Up @@ -103,8 +104,8 @@ public Result<List<Route>> getRouteList(@PathVariable Integer id) {
@PatchMapping("/bindingRoute/{id}")
@ApiOperation("分配角色权限")
@ApiOperationSupport(author = "刘宇阳 | liuyuyang1024@yeah.net", order = 9)
public Result<String> bindingRoute(@PathVariable Integer id, @RequestBody List<Integer> ids) {
roleService.bindingRoute(id, ids);
public Result<String> bindingRoute(@PathVariable Integer id, @RequestBody BindRouteAndPermission data) {
roleService.binding(id, data);
return Result.success();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import liuyuyang.net.annotation.CheckRole;
import liuyuyang.net.annotation.PremName;
import liuyuyang.net.dto.user.EditPassDTO;
import liuyuyang.net.dto.user.UserDTO;
Expand Down
2 changes: 1 addition & 1 deletion blog/src/main/java/liuyuyang/net/mapper/RoleMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ public interface RoleMapper extends BaseMapper<Role> {
public List<Route> getRouteList(Integer id);

// 查询指定角色的所有权限
@Select("select p.* from permission p, role r where p.role_id = r.id and r.id = #{id}")
@Select("select p.* from role r, permission p, role_permission rp where r.id = rp.role_id and p.id = rp.permission_id and r.id = #{id}")
public List<Permission> getPermissionList(Integer id);
}
10 changes: 10 additions & 0 deletions blog/src/main/java/liuyuyang/net/mapper/RolePermissionMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package liuyuyang.net.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import liuyuyang.net.model.RolePermission;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface RolePermissionMapper extends BaseMapper<RolePermission> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package liuyuyang.net.service;

import com.baomidou.mybatisplus.extension.service.IService;
import liuyuyang.net.model.RolePermission;

public interface RolePermissionService extends IService<RolePermission> {
}
3 changes: 2 additions & 1 deletion blog/src/main/java/liuyuyang/net/service/RoleService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package liuyuyang.net.service;

import com.baomidou.mybatisplus.extension.service.IService;
import liuyuyang.net.dto.role.BindRouteAndPermission;
import liuyuyang.net.model.Permission;
import liuyuyang.net.model.Role;
import liuyuyang.net.model.Route;
Expand All @@ -11,5 +12,5 @@ public interface RoleService extends IService<Role> {
List<Route> getRouteList(Integer id);
List<Permission> getPermissionList(Integer id);

void bindingRoute(Integer id, List<Integer> ids);
void binding(Integer id, BindRouteAndPermission data);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package liuyuyang.net.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import liuyuyang.net.mapper.RolePermissionMapper;
import liuyuyang.net.model.RolePermission;
import liuyuyang.net.service.RolePermissionService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper, RolePermission> implements RolePermissionService {

}
36 changes: 22 additions & 14 deletions blog/src/main/java/liuyuyang/net/service/impl/RoleServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import liuyuyang.net.dto.role.BindRouteAndPermission;
import liuyuyang.net.execption.CustomException;
import liuyuyang.net.mapper.PermissionMapper;
import liuyuyang.net.mapper.RoleMapper;
import liuyuyang.net.mapper.RolePermissionMapper;
import liuyuyang.net.mapper.RouteRoleMapper;
import liuyuyang.net.model.Permission;
import liuyuyang.net.model.Role;
import liuyuyang.net.model.Route;
import liuyuyang.net.model.RouteRole;
import liuyuyang.net.model.*;
import liuyuyang.net.service.RoleService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -24,6 +23,8 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
private RoleMapper roleMapper;
@Resource
private RouteRoleMapper routeRoleMapper;
@Resource
private RolePermissionMapper rolePermissionMapper;

@Override
public List<Route> getRouteList(Integer id) {
Expand All @@ -36,22 +37,29 @@ public List<Permission> getPermissionList(Integer id) {
}

@Override
public void bindingRoute(Integer roleId, List<Integer> ids) {
if (ids == null || ids.isEmpty()) {
throw new CustomException(400, "请确保参数完整");
}
public void binding(Integer roleId, BindRouteAndPermission data) {
// 先删除当前角色绑定的所有路由和权限
QueryWrapper<RouteRole> routeQueryWrapper = new QueryWrapper<>();
routeQueryWrapper.eq("role_id", roleId);
routeRoleMapper.delete(routeQueryWrapper);

// 先删除当前角色绑定的所有路由
QueryWrapper<RouteRole> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("role_id", roleId);
routeRoleMapper.delete(queryWrapper);
QueryWrapper<RolePermission> permissionQueryWrapper = new QueryWrapper<>();
permissionQueryWrapper.eq("role_id", roleId);
rolePermissionMapper.delete(permissionQueryWrapper);

// 然后重新给角色绑定所有路由
for (Integer routeId : ids) {
// 然后再重新给角色绑定路由和权限
for (Integer routeId : data.getRoute_ids()) {
RouteRole routeRole = new RouteRole();
routeRole.setRoleId(roleId);
routeRole.setRouteId(routeId);
routeRoleMapper.insert(routeRole);
}

for (Integer permissionId : data.getPermission_ids()) {
RolePermission rolePermission = new RolePermission();
rolePermission.setRoleId(roleId);
rolePermission.setPermissionId(permissionId);
rolePermissionMapper.insert(rolePermission);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package liuyuyang.net.dto.role;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

@Data
public class BindRouteAndPermission {
@ApiModelProperty(value = "路由id列表", example = "[1,2,3]", required = true)
List<Integer> route_ids;
@ApiModelProperty(value = "权限id列表", example = "[3,2,1]", required = true)
List<Integer> permission_ids;
}
21 changes: 21 additions & 0 deletions model/src/main/java/liuyuyang/net/model/RolePermission.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package liuyuyang.net.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@TableName("role_permission")
public class RolePermission {
@TableId(type = IdType.AUTO)
@ApiModelProperty(value = "ID")
private Integer id;

@ApiModelProperty(value = "角色ID", example = "1", required = true)
private Integer roleId;

@ApiModelProperty(value = "权限ID", example = "1", required = true)
private Integer permissionId;
}

0 comments on commit d23a018

Please sign in to comment.