如何默认拒绝访问所有URL?

2022-09-03 00:36:24

在定义新的 spring boot REST 资源时,我往往会忘记为它们的 url 模式创建一个 spring 安全配置。

默认情况下,如何拒绝访问所有 URL,并且只允许访问显式配置的 URL 模式?(我正在使用 for 以允许访问)我想避免尽可能多的意外安全漏洞。.hasRole

假设我有三个 REST 资源:、 和 。我当前的代码可能如下所示:/jobs/desks/salary

http.authorizeRequests()

    .antMatchers(HttpMethod.GET, "/jobs")
    .hasRole("my_user")

    .antMatchers(HttpMethod.GET, "/desks")
    .hasRole("my_user");

但目前,对url的访问已提供给所有人(因为它尚未配置)!/salary


答案 1

Spring 的基于表达式的访问控制有一个表达式,其计算结果始终为 。denyAllfalse

因此,您可以做的是使用此方法拒绝访问所有内容,然后可能允许通过以下方式访问某个URL:denyAllhasRole

http.authorizeRequests().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();

因此,例如,这将允许具有 ADMIN 访问权限的用户访问以 开头的任何页面。然后它将拒绝访问所有其他页面。请注意,顺序很重要,因为如果您输入,它将拒绝所有访问并忽略表达式的其余部分。/admin.antMatchers("/**").denyAll()

或者,您可以使用特定的URL模式:permitAll()

http.authorizeRequests().antMatchers("/users/**").permitAll().antMatchers("/**").denyAll();

请注意,您可能还需要允许访问某种登录方式,因此系统可以让某人使用特定角色登录,因此要将其组合在一起,并允许所有人尝试登录,只有管理员用户才能访问管理页面并拒绝所有其他页面,然后如下所示:

http.authorizeRequests().antMatchers("/login").permitAll().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();

答案 2

默认情况下,您可以使用:拒绝所有请求,并显式允许请求.anyRequest().denyAll().hasRole


推荐