java - 默认情况下如何拒绝对所有 URL 的访问?

标签 java spring spring-boot spring-security

在定义新的 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/

相关文章:

java - NoSuchElementException : Unable to locate element in popup window

java - 不兼容的类型,预期的 hashmap 找到了 String

java - 如何使用 dragger 2 创建带有模拟数据的单例类?

spring - 如何在 Spring Security @PreAuthorize/@PostAuthorize 注解中使用自定义表达式

java - systemProperties和integrationGlobalProperties冲突

java - 将 BufferedImage 转换为 byte[],不会损失质量并增加大小

java - 如何在不重启应用程序服务器的情况下在 spring 中重新初始化 beans

java - 使用 JWT 完成请求后是否必须清空 SecurityContextHolder

java - 插入嵌入式文档而不阅读整个文档 - spring,mongo

Spring Boot 在集成测试期间不解析 application.properties 中的自定义属性