大致权限控制完成,新增优化权限控制代码

master
赵亚鹏 4 days ago
parent 99128aa40c
commit a89b72fca1

@ -2,9 +2,9 @@ package cn.zyp.stusystem.controller;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.zyp.stusystem.common.Result; import cn.zyp.stusystem.common.Result;
import cn.zyp.stusystem.constant.PermissionConstants;
import cn.zyp.stusystem.dto.LoginDTO; import cn.zyp.stusystem.dto.LoginDTO;
import cn.zyp.stusystem.entity.User; import cn.zyp.stusystem.entity.User;
import cn.zyp.stusystem.service.RoleService;
import cn.zyp.stusystem.service.UserService; import cn.zyp.stusystem.service.UserService;
import cn.zyp.stusystem.vo.LoginResult; import cn.zyp.stusystem.vo.LoginResult;
import cn.zyp.stusystem.vo.UserVO; import cn.zyp.stusystem.vo.UserVO;
@ -23,6 +23,9 @@ public class LoginController {
@Autowired @Autowired
private UserService userService; private UserService userService;
@Autowired
private RoleService roleService;
@PostMapping("/login") @PostMapping("/login")
public Result<LoginResult> login(@RequestBody LoginDTO loginDTO) { public Result<LoginResult> login(@RequestBody LoginDTO loginDTO) {
// 1. 根据用户名查询用户信息 // 1. 根据用户名查询用户信息
@ -36,16 +39,28 @@ public class LoginController {
// 3. SaToken登录自动生成token // 3. SaToken登录自动生成token
StpUtil.login(user.getId()); StpUtil.login(user.getId());
// 4. 在Session中存储角色和权限 // 4. 获取用户权限(从数据库获取,而不是从常量)
List<String> permissions = userService.getUserPermissions(user.getId());
// 5. 获取角色ID如果user中没有roleId则根据role查找
Long roleId = user.getRoleId();
if (roleId == null && user.getRole() != null) {
roleId = roleService.getRoleIdByRoleCode(user.getRole());
}
// 6. 在Session中存储角色和权限
StpUtil.getSession().set("role", user.getRole()); StpUtil.getSession().set("role", user.getRole());
List<String> permissions = PermissionConstants.ROLE_PERMISSIONS.get(user.getRole());
StpUtil.getSession().set("permissions", permissions); StpUtil.getSession().set("permissions", permissions);
if (roleId != null) {
StpUtil.getSession().set("roleId", roleId);
}
// 5. 构建返回数据 // 7. 构建返回数据
UserVO userVO = new UserVO(); UserVO userVO = new UserVO();
userVO.setId(user.getId()); userVO.setId(user.getId());
userVO.setUsername(user.getUsername()); userVO.setUsername(user.getUsername());
userVO.setRole(user.getRole()); userVO.setRole(user.getRole());
userVO.setRoleId(roleId != null ? roleId.toString() : null); // 转换为字符串,前端需要
userVO.setName(user.getName()); userVO.setName(user.getName());
userVO.setPermissions(permissions); userVO.setPermissions(permissions);

@ -15,23 +15,5 @@ public class RolePermissionController {
@Autowired @Autowired
private RolePermissionService rolePermissionService; private RolePermissionService rolePermissionService;
/**
*
*/
@GetMapping("/{roleId}/permissions")
public Result<List<String>> getRolePermissions(@PathVariable Long roleId) {
List<String> permissionCodes = rolePermissionService.getPermissionCodesByRoleId(roleId);
return Result.success(permissionCodes);
}
/**
*
*/
@PostMapping("/{roleId}/permissions")
public Result<Boolean> saveRolePermissions(
@PathVariable Long roleId,
@RequestBody SaveRolePermissionsDTO dto) {
rolePermissionService.saveRolePermissions(roleId, dto.getPermissions());
return Result.success(true);
}
} }

@ -3,6 +3,7 @@ package cn.zyp.stusystem.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -13,9 +14,15 @@ public class Role {
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private Long id; private Long id;
private String roleCode; // 角色代码,如 admin private String roleCode;
private String roleName; // 角色名称,如 管理员 private String roleName;
private Integer status; // 状态1-启用0-禁用 private Integer status;
private String remark;
// 前端期望字段名是 createTime
@JsonProperty("createTime")
private LocalDateTime createdAt; private LocalDateTime createdAt;
@JsonProperty("updateTime")
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
} }

@ -5,6 +5,7 @@ import cn.zyp.stusystem.mapper.RolePermissionMapper;
import cn.zyp.stusystem.service.RolePermissionService; import cn.zyp.stusystem.service.RolePermissionService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -16,6 +17,10 @@ import java.util.stream.Collectors;
public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper, RolePermission> public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper, RolePermission>
implements RolePermissionService { implements RolePermissionService {
@Autowired
private RolePermissionMapper rolePermissionMapper;
@Override @Override
public List<String> getPermissionCodesByRoleId(Long roleId) { public List<String> getPermissionCodesByRoleId(Long roleId) {
if (roleId == null) { if (roleId == null) {
@ -52,10 +57,10 @@ public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper,
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveRolePermissions(Long roleId, List<String> permissionCodes) { public void saveRolePermissions(Long roleId, List<String> permissionCodes) {
// 1. 删除该角色的所有现有权限使用MyBatis-Plus的remove方法 // 1. 删除该角色的所有权限
remove(new LambdaQueryWrapper<RolePermission>() LambdaQueryWrapper<RolePermission> wrapper = new LambdaQueryWrapper<>();
.eq(RolePermission::getRoleId, roleId) wrapper.eq(RolePermission::getRoleId, roleId);
); rolePermissionMapper.delete(wrapper);
// 2. 批量插入新权限 // 2. 批量插入新权限
if (permissionCodes != null && !permissionCodes.isEmpty()) { if (permissionCodes != null && !permissionCodes.isEmpty()) {
@ -68,8 +73,7 @@ public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper,
return rp; return rp;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
this.saveBatch(rolePermissions);
saveBatch(rolePermissions);
} }
} }
} }

@ -2,14 +2,54 @@ package cn.zyp.stusystem.service.impl;
import cn.zyp.stusystem.entity.User; import cn.zyp.stusystem.entity.User;
import cn.zyp.stusystem.mapper.UserMapper; import cn.zyp.stusystem.mapper.UserMapper;
import cn.zyp.stusystem.service.RolePermissionService;
import cn.zyp.stusystem.service.RoleService;
import cn.zyp.stusystem.service.UserService; import cn.zyp.stusystem.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private RolePermissionService rolePermissionService;
@Autowired
private RoleService roleService;
@Override @Override
public User getByUsername(String username) { public User getByUsername(String username) {
return lambdaQuery().eq(User::getUsername,username).one(); return lambdaQuery().eq(User::getUsername, username).one();
}
@Override
public List<String> getUserPermissions(Long userId) {
// 1. 查询用户信息
User user = getById(userId);
if (user == null) {
return List.of();
}
// 2. 获取角色ID优先使用roleId如果没有则根据role查找
Long roleId = user.getRoleId();
if (roleId == null && user.getRole() != null) {
roleId = roleService.getRoleIdByRoleCode(user.getRole());
// 如果找到了roleId更新到user表优化后续查询
if (roleId != null) {
user.setRoleId(roleId);
updateById(user);
}
}
// 3. 如果还是没有roleId返回空列表
if (roleId == null) {
return List.of();
}
// 4. 查询该角色的所有权限
return rolePermissionService.getPermissionCodesByRoleId(roleId);
} }
} }

@ -1,14 +1,14 @@
package cn.zyp.stusystem.vo; package cn.zyp.stusystem.vo;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@Data @Data
public class UserVO { public class UserVO {
private Long id; private Long id;
private String username; private String username;
private String role; private String role; // 角色代码,如 admin
private String roleId; // 角色ID字符串类型前端需要
private String name; private String name;
private List<String> permissions; private List<String> permissions; // 权限列表
} }
Loading…
Cancel
Save