在 spring security 或 RBAC 中,Authority 被描述为一个字符串,例如“download-file”表示用户可以下载文件。如果我需要限制用户最大每日下载时间并为不同的用户分配不同的值,这意味着权限包含动态值,我该如何在 spring security 中做到这一点?
2 回答
正如您所暗示的那样,权限(即角色)和权限之间存在差异。权限倾向于广泛申请应用程序并且没有状态,而权限倾向于针对特定对象并包含状态。
这似乎更像是域问题而不是权限问题。将逻辑放入安全性有点像拥有一个必须包含有效电子邮件的表单并在安全性中检查电子邮件格式。我会考虑将逻辑移到安全代码之外。
如果您真的想使用 Spring Security 执行此操作,我将使用执行检查的自定义 Bean:
@Component
public class Download {
public boolean isAlowedForUser(Authentication authentication) {
// ...
return result;
}
public boolean isAllowedForCurrentUser() {
return isAllowedForUser(SecurityContextHolder.getContext().getAuthentiation());
}
}
然后您可以将 Bean 自动装配到您的代码中,并通过调用代码来检查权限。如果您愿意,还可以集成到 Spring Security 的方法安全性中来执行检查。要启用它,您需要@EnableGlobalMethodSecurity(prePostEnabled = true)
在您的配置类之一的顶部指定。然后你可以在 Spring 托管的 Bean 上使用类似的东西:
@PreAuthorize("@download.isAllowedForCurrentUser()")
public void downloadFile(String fileName) {
请参考此链接 Spring Boot : Custom Role - Permission Authorization using SpEL
您可以添加新权限,例如“DOWNLOAD_FILE”并验证当前用户是否具有该权限,使用 -
@PreAuthorize("hasPermission('DOWNLOAD_FILE')")
您还可以限制角色的访问权限
@PreAuthorize("hasRole('ADMIN') and hasPermission('DOWNLOAD_FILE')")