如何在spring中禁用默认的get请求,因为它公开了所有数据?

rdlzhqv9  于 2021-07-15  发布在  Java
关注(0)|答案(2)|浏览(275)

我有一个spring控制器,具有以下Map

@RestController
public class UserController {

    public UserService service;

    public UserController(UserService service) {
        this.service = service;
    }

    @PostMapping("/users/create")
    ResponseEntity<User> create (@RequestBody User user){
        return new ResponseEntity<>(this.service.create(user), HttpStatus.CREATED);
    }

    @GetMapping("/users/{id}")
    ResponseEntity<User> getById(@PathVariable Long id) {
        return ResponseEntity.ok(this.service.findById(id));
    }

    @GetMapping("/users/all")
    List<User> getAll() {
        return this.service.findAll();
    }

    @PutMapping("/users/{id}")
    User updateUser(@RequestBody User newUser, @PathVariable Long id) {
        return this.service.updateUser(newUser, id);
    }

    @DeleteMapping("/users/{id}")
    void deleteUser(@PathVariable Long id) {

        this.service.deleteById(id);
    }

}

当我向 http://localhost:8080/users/all 我得到了所有用户的列表。但我注意到如果我向 http://localhost:8080/users 它返回一个包含所有数据的列表,如下所示

{
    "_embedded": {
        "users": [
            {
                "admin": false,
                "name": "Name",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/users/1"
                    },
                    "user": {
                        "href": "http://localhost:8080/users/1"
                    },
                    "tickets": {
                        "href": "http://localhost:8080/users/1/tickets"
                    }
                }
            },
            {
                "admin": false,
                "name": "Example",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/users/2"
                    },
                    "user": {
                        "href": "http://localhost:8080/users/2"
                    },
                    "tickets": {
                        "href": "http://localhost:8080/users/2/tickets"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://localhost:8080/users"
        },
        "profile": {
            "href": "http://localhost:8080/profile/users"
        }
    },
    "page": {
        "size": 20,
        "totalElements": 4,
        "totalPages": 1,
        "number": 0
    }
}

为什么spring能够返回这个数据,即使它没有显式Map,我怎么能禁用它呢。这只是一个个人训练练习,所以安全不是至关重要的,但我想知道如何避免这一点,因为如果这是真的,我可能会意外地暴露所有数据。
任何建议都将不胜感激,谢谢。
更新:有人建议get(/users/{id})Map使用空值,我将其注解掉并尝试再次调用它。提供一个号码返回405,因为该服务已不存在,但我尝试了http://localhost:8080/users/但它仍然返回上面显示的所有数据

0aydgbwb

0aydgbwb1#

看起来您正在spring数据rest中使用hateoas格式https://spring.io/projects/spring-data-rest.
您可以通过设置参数来禁用它:spring.data.rest.defaultmediatype=application/json

p5cysglq

p5cysglq2#

我设法找到了解决办法,补充说:

@SpringBootApplication(exclude = RepositoryRestMvcAutoConfiguration.class)

到main方法将禁用hateoas函数
我从这篇文章中找到了解决方案:spring数据rest没有hateoas

相关问题