我有一个spring boot
应用程序,使用spring-data-rest
实现角色基本访问控制机制,以根据用户角色保护对资源的访问。
要求是:具有特定角色的用户只能访问对象的某些部分。
例如:staff
角色的用户可以仅查看/更新对象user
的基本信息(名称,年龄),但角色为admin
的用户可以做任何事情
我现在使用带有spring-security
注释的pre/post
来再次检查用户的权限,但它只控制对整个对象的加入。
反正有吗?
答案 0 :(得分:2)
@Secured
/ @RolesAllowed
注释用于指定方法上的角色列表。因此,如果用户至少具有一个指定的角色,则用户只能访问该方法。
您可能有不同的方法来执行特定任务,例如查看/更新/或其他任务。例如:
@Secured({ "ROLE_VIEWER", "ROLE_EDITOR" }) //@RolesAllowed("ROLE_VIEWER")
public boolean isValidUsername(String username) {
return userRoleRepository.isValidUsername(username);
}
除此之外,如果请求对象可用,还可以在原始Java代码中以编程方式检查用户的权限:
request.isUserInRole("someAuthority")
,然后执行操作或处理错误。
答案 1 :(得分:0)
您应该自定义规则。
在访问资源集合时,您需要自己过滤资源。
访问单个资源时,可以在控制器或服务中抛出异常。您可以使用@ControllerAdvice
和@ExceptionHandler(Exception.class)
来捕获您的控制器。然后返回403错误。
如
public class AccessErrorException extends Exception{
public AccessErrorException(String message){
super(message);
}
}
ControlerAdvice
:
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(AccessErrorException.class)
public void handleException(AccessErrorException e){
LOGGER.error(e.getMessage(), e);
// do something send.error(403)
}
}
服务:
public interface RoleService {
Role queryById() throw AccessErrorException;
}