根据部门来做数据权限,新的业务表中添加了dept_id,新增数据的时候dept_id怎么传入?
本来使用SecurityFrameworkUtils工具类获取登录用户信息,但是发现没有存deptId,要从SecurityFrameworkUtils工具类获取的话,要改很多代码(认证,生成token那些代码),后端有什么简单的方式获取当前登录者的dept_id吗?
3 个回答
你可以通过在登录时,将登录用户的dept_id存入token中,然后在后续的接口调用中从token中获取dept_id。这样做的好处是不需要修改太多的代码,只需要在登录时进行一次存储即可。具体实现可以参考以下步骤:
- 在用户登录成功后,将dept_id存入token中。你可以使用JWT令牌机制来生成token,将dept_id作为其中的一个payload存储。示例代码如下:
javaCopy codeString token = Jwts.builder()
.setSubject(username)
.claim("dept_id", deptId) // 将dept_id存入payload中
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
- 在需要获取dept_id的接口中,通过从token中获取dept_id来进行数据权限的限制。示例代码如下:
javaCopy code@PreAuthorize("@securityService.hasPermission(#deptId)") // 通过自定义注解限制数据权限
@GetMapping("/list")
public List<Data> getDataList(@RequestParam("dept_id") Long deptId) {
// 从token中获取dept_idString token = SecurityContextHolder.getContext().getAuthentication().getCredentials().toString();
Long deptIdFromToken = Long.valueOf(Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().get("dept_id").toString());
// 判断请求的dept_id与token中的dept_id是否一致if (!deptId.equals(deptIdFromToken)) {
throw new ForbiddenException("无权访问该数据");
}
// 查询数据
List<Data> dataList = dataService.getDataList(deptId);
return dataList;
}
在上面的代码中,我们使用了自定义注解来限制数据权限。在该注解中,我们可以根据登录用户的角色、部门等信息来判断该用户是否有权限访问该数据。如果没有权限,就抛出ForbiddenException异常,否则就返回查询结果。