当前位置: 首页 > 知识库问答 >
问题:

如何为基于spring的rest API和静态内容增加安全性

潘涵煦
2023-03-14

我有一个web应用程序+一组使用Spring创建的rest API。它本质上是一些html页面向rest服务器发送ajax请求。结构看起来有点像这样:

  1. 相同的凭据可用于静态内容和rest调用。
  2. 用户可以通过登录页登录,对于进一步的rest调用,可以使用某种令牌或从服务器返回的东西。

我已经检查了rest API的Spring Security方案,并找到了一些关于静态内容安全的资源,但无法找到如何将其与上述内容结合在一起的方法。

共有1个答案

燕鸿波
2023-03-14

我猜你想拥有两套资源。其中一个开放供公众访问,例如在/public上下文中提供,另一个受保护,在/protected中提供。

首先,您应该在Web配置中创建一些资源处理程序:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    // other stuffs

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/public/**").addResourceLocations("classpath:/public/");
        registry.addResourceHandler("/protected/**").addResourceLocations("classpath:/resources/");
    }
}

这样,/public目录中的所有静态内容将在/public/**endpoint提供服务,/protected/**endpoint将为/resources目录中的文件提供服务。

则应配置Spring Security性以保护/protected/**endpoint:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // other stuffs

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers("/public/**").permitAll()
                    .antMatchers("/protected/**").authenticated()
                    .anyRequest().authenticated();
    }
}

更新RESTendpoint,您可以使用相同的匹配器,也可以使用方法级别安全进行更精细的粒度控制。为了启用方法级安全性,请将@EnableGlobalMethodSecurity(prePostEnabled=true)添加到SecurityConfig中。然后可以在hanlder方法上使用prepost注释,如下所示:

@RestController
@RequestMapping("/greet")
public class GreetingService {
    // it's a public rest endpoint
    @PreAuthorize("permitAll()")
    @RequestMapping("/public")
    public void doGreetToPublicUsers() {...}

    // it's a protected rest endpoint
    @PreAuthorize("isAuthenticated()")
    @RequestMapping("/protected")
    public void doGreetToProtectedUsers() {...}

    // it's a role protected rest endpoint
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @RequestMapping("/admin")
    public void justForAdmin() {...}
}
 类似资料:
  • 在过去的几天里,我一直在和Spring保安公司战斗,所以我希望有人能在这里帮助我。 我正在使用Spring Boot 1.2.5 我使用的是Spring Actuator和Spring Remote Shell,它们已经从类路径中删除,认为它们可能会引起问题 我排除了SecurityAutoConfigsion,因为它可能会导致我的问题 这是我的主要课程 这是我的安全配置 我的问题/问题是 > C

  • 我从这个来源构建了一个基本的spring身份验证服务:https://spring.io/guides/gs/securing-web/ 试图使用stackoverflow上几乎所有的解决方案来包含本地文件夹中的JS文件,但是我做不到。当html页面加载时,它显示:< br >“未捕获的引用错误:未定义我的函数” 这是我的home.html剧本: 这是我的js文件所在的位置,htmls被放置在模板

  • 问题内容: 我想在Spring Boot项目中添加基于方法的安全性。 似乎我只需要添加和bean,用和注释方法。 但是加入豆子之后 我得到一个消息:“配置默认的servlet处理需要ServletContext”: 我在网上可以找到的所有内容都与jUnit测试有关。为什么会引发此异常?我想念什么?我是否必须添加一个ServletContext bean,如果需要,如何添加? 我的要求是Gradle

  • 这个问题让我头疼。我有一个简单的controller类,它能够呈现一个简单的html页面以及Spring Boot初始化器类。 我已经将HTML页面放在src/main/resources目录下的静态文件夹中。但我无法获得html页面。相反,我得到了404个错误。 下面是我的项目的结构 simpleController.java: home.html: 运行Spring Boot时的控制台日志:

  • 注意: 本教程假定你已经下载和安装了CodeIgniter开发环境。 首先,你需要创建一个可以处理静态内容请求的控制器类。控制器,是一个用来代理完成某项任务的PHP类,它充当基于MVC架构应用程序的“粘合剂”(译者注:控制器用来粘合/协调不同模型和视图。随着教程的深入,你会更深刻的理解这一点)。 举例来说,假设存在某个针对如下URL的请求: http://example.com/news/late