在定义新的 spring boot REST 资源时,我往往会忘记为它们的 url 模式创建一个 spring 安全配置。
如何在默认情况下拒绝访问所有 URL,只允许访问明确配置的 URL 模式? (我使用 .hasRole
来允许访问)我想尽可能多地避免意外的安全漏洞。
假设我有三个 REST 资源:/jobs
、/desks
和 /salary
。我当前的代码可能如下所示:
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/jobs")
.hasRole("my_user")
.antMatchers(HttpMethod.GET, "/desks")
.hasRole("my_user");
但是目前,对url /salary
的访问是提供给大家的(因为还没有配置)!
最佳答案
Spring 的Expression-Based Access Control有一个 denyAll
表达式,它的计算结果总是 false
。
所以你可以做的是使用这个 denyAll
方法来拒绝访问所有内容,然后可能允许通过 hasRole
访问某个 URL:
http.authorizeRequests().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();
例如,这将允许具有 ADMIN 访问权限的用户访问以 /admin
开头的任何页面。然后它将拒绝访问所有其他页面。请注意,顺序很重要,就像您输入 .antMatchers("/**").denyAll()
first,它会拒绝 all 访问并忽略你表达的其余部分。
或者,您可以将 permitAll()
用于特定的 URL 模式:
http.authorizeRequests().antMatchers("/users/**").permitAll().antMatchers("/**").denyAll();
请注意,您可能还需要允许访问某种登录方式,因此系统可以让某人以特定角色登录,因此将它们组合在一起,并允许所有人尝试登录,只有管理员用户访问管理页面并拒绝所有其他人,然后是:
http.authorizeRequests().antMatchers("/login").permitAll().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();
关于java - 默认情况下如何拒绝对所有 URL 的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51385335/