如何保护SpringBoot / Spring-Data Rest,以便用户只能部分访问对象

时间:2018-04-09 03:21:03

标签: java spring-boot rbac

我有一个spring boot应用程序,使用spring-data-rest实现角色基本访问控制机制,以根据用户角色保护对资源的访问。

要求是:具有特定角色的用户只能访问对象的某些部分

例如:staff角色的用户可以仅查看/更新对象user的基本信息(名称,年龄),但角色为admin的用户可以做任何事情

我现在使用带有spring-security注释的pre/post来再次检查用户的权限,但它只控制对整个对象的加入。

反正有吗?

2 个答案:

答案 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;
}