使用 Spring Security 保护 REST 端点

Posted

技术标签:

【中文标题】使用 Spring Security 保护 REST 端点【英文标题】:Securing REST endpoint using spring security 【发布时间】:2016-03-04 08:11:26 【问题描述】:

我正在尝试为 REST 端点提供安全性。我正在遵循this page 的指示。在我的情况下,我没有视图,因此我没有创建控制器来指定视图,也没有在我的 AppConfig.java 中添加 viewResolver

实施后,它会在调用安全 REST 端点时正确显示拒绝访问错误。但是,即使我在请求标头中指定了用户名/密码,我也会收到拒绝访问错误。我正在测试邮递员在基本身份验证中设置用户名/密码。我错过了什么?

【问题讨论】:

您可以先发布失败的请求和您正在提交的 HTTP 请求的调试日志 您能发布您的部分代码吗? @Milkyway 出于安全原因,我不愿意发布代码,但出于测试目的,可以从我提到的链接中使用代码,在那篇文章中必须忽略 UI 相关代码。 【参考方案1】:

您遵循的示例是实现基于表单的身份验证。 为了将其更改为 http auth(更适合 REST 服务),您需要查找以下 @987654323您的 security.xml 中的 @ 标记:

<form-login 
        login-page="/login" 
        default-target-url="/welcome" 
        authentication-failure-url="/login?error" 
        username-parameter="username"
        password-parameter="password" />

只需将其更改为空的http-basic 标签:

<http-basic />

如果您没有更改任何其他内容,那么它应该可以完美运行。您还可以通过尝试访问您的页面从浏览器测试您的设置。如果您正确配置了所有内容,这次您将得到一个弹出窗口,而不是表单。这将是欢迎您的基于 HTTP 的身份验证。

由于您可能正在使用基于 Java 的配置,因此此更改的等效项是替换:

  http.authorizeRequests()
    .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
    .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
    .and().formLogin();

与:

  http.authorizeRequests()
    .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
    .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
    .and().httpBasic();

【讨论】:

虽然您的答案是正确的,但告诉他将 SecurityConfig.java 文件中的 .formLogin() 替换为 .httpBasic() 可能会更有帮助,因为他使用的是 JavaConfig 而不是 xml- s. 你是对的。我想这是很明显的补充,但为了清楚起见,我把它放在那里。 你好。我怎么能在弹簧靴中做同样的事情。? , 因为我没有任何配置文件。只使用注释。你能告诉我在 Spring Boot 中该怎么做吗?请参考问题 - ***.com/questions/49728473/…

以上是关于使用 Spring Security 保护 REST 端点的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 保护 REST API

使用 spring-security-oauth2 2.0.5.RELEASE 保护 Spring REST 服务

如何使用 Spring Security 和 Angularjs 保护 Spring Rest 服务?

使用 Spring Security Rest 插件保护 Grails Rest Api

Spring starter security or spring cloud security 如何保护整个微服务架构?

使用 Spring Security 保护 REST 微服务