- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个 Spring Boot + Spring Security 应用程序,它有几个antMatchers
路径;一些 fullyAuthenticated()
,一些 permitAll()
。
如何编写一个测试来验证 SecurityConfiguration
我的端点在 /api/**
下(以及最终其他)是否得到正确保护?
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
//...
.antMatchers("/api/**").fullyAuthenticated()
}
}
使用 spring-boot-1.5.2.RELEASE
、spring-security-core-4.2.2-release
。
澄清1:我想尽可能直接地测试 SecurityConfiguration
,而不是通过 /api/** 之一进行传递测试
个端点,它们可能有自己的 @PreAuthorize
安全性。
澄清2:我想要类似于 WebSecurityConfigurerAdapterTests 的东西.
Clarification3:我想在 Spring Security 层进行 @Autowire
一些东西,最好是 HttpSecurity
来测试。
最佳答案
所以你要确保如果有人将 .antMatchers("/api/**")
更改为 .antMatchers("/WRONG_PATH/**")
那么你有一个可以解决的测试吗?
您使用 HttpSecurity
定义的规则最终会配置一个带有一个或多个 SecurityFilterChain
的 FilterChainProxy
,每个都有一个过滤器列表。每个过滤器,例如 UsernamePasswordAuthenticationFilter
(用于基于表单的登录),将在父类(super class) AbstractAuthenticationProcessingFilter
中定义一个 RequestMatcher
。问题是 RequestMatcher
是一个接口(interface),目前有 12 种不同的实现,这包括 AndRequestMatcher
和 OrRequestMatcher
,所以匹配逻辑并不总是简单的。而且最重要的是RequestMatcher
只有一个方法boolean matches(HttpServletRequest request)
,而且实现往往不会暴露配置,所以你必须使用反射来访问私有(private)每个 RequestMatcher
实现的配置(将来可能会改变)。
如果你走这条路,将 FilterChainProxy
自动连接到测试中并使用反射对配置进行逆向工程,你必须考虑你拥有的所有实现依赖项。例如 WebSecurityConfigurerAdapter
有一个默认的过滤器列表,它可能会在版本之间改变,除非禁用它,当它被禁用时,你必须明确定义每个过滤器。此外,新的过滤器和 RequestMatchers
可能会随着时间的推移添加,或者在一个 Spring Security 版本中由 HttpSecurity
生成的过滤器链在下一个版本中可能会略有不同(可能不是可能,但仍然可能)。
为您的 spring 安全配置编写一个通用测试在技术上是可行的,但这并不是一件容易的事情,而且 Spring Security 过滤器当然不是为了支持这一点而设计的。自 2010 年以来,我与 Spring Security 进行了广泛的合作,我从来没有需要过这样的测试,而且我个人认为尝试实现它会浪费时间。我认为花时间编写一个测试框架会更好,这样可以轻松编写集成测试,这将隐式测试安全层以及业务逻辑。
关于Spring Security HttpSecurity 配置测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43663688/
我正在为 Spring Boot Rest 服务器配置 HttpSecurity,并且我需要使创建用户端点不需要身份验证。 Controller 方法的映射是POST/users/{username}
我有带有 OAuth2 的 Spring Boot 应用程序。我想打开一些端点以进行匿名访问。我可以使用以下方法做到这一点: http .authorizeRequests()
我的Grails 3.0.3应用程序中有一个相当简单的安全配置: @Configuration @EnableWebSecurity class SecurityConfiguration exten
作为一名解决方案架构师,我想为当前应用程序上下文中的所有 Spring Security 过滤器链添加一个过滤器,无论它们是如何或在何处声明的,这样忘记添加它的开发人员就不会错过这个过滤器. 假设不同
您可以通过执行以下操作向响应添加 header @EnableWebSecurity public class CacheControl extends WebSecurityConfigurerAd
我从这里开始关注 Spring Security 指南,http://docs.spring.io/spring-security/site/docs/3.2.0.RELEASE/reference/
我有一个 Spring Boot + Spring Security 应用程序,它有几个antMatchers 路径;一些 fullyAuthenticated(),一些 permitAll()。 如
I am doing Spring Security Oauth2. In client side I override configure(HttpSecurity http) method and
我试图了解 RequestMatcher、AntMatcher 等是如何工作的。我阅读了一些帖子并了解了基础知识。实际上我有这个简单的基本配置: @Override protected void co
我正在尝试向我的应用程序添加一个不安全的 Controller 端点 /foo/bar,但每当我尝试调用它时,我都会收到 401 Unauthorized。 这是我的 WebSecurityConfi
谁能解释一下何时覆盖 configure(HttpSecurity)、configure(WebSecurity) 和 configure(AuthenticationManagerBuilder)?
我收到 POST 端点错误 403 Forbidden,其他端点按预期工作。 我有 4 个端点,我需要重现身份验证行为: GET \users - no authentication GET \det
要在 Spring Boot 中提供自定义身份验证提供程序,我是否需要以下两项?它们有什么区别? AuthenticationManagerBuilder HttpSecurity.authentic
这个问题已经有答案了: Spring Security : Multiple HTTP Config not working (2 个回答) 已关闭 4 年前。 我已按照以下说明为管理员和用户创建两个
我尝试实现spring security,但是我有很多角色和权限,然后我想将角色动态添加到彼此的资源中。喜欢它: @Override protected void configure(HttpSecu
我正在尝试将 Spring Security 实现到我的基于 MVC Maven 的项目,并已包含 Spring Boot。 我有工作前端和后端,但直到现在我都在使用假登录 - 我只是通过 JS 和
在 WebSecurityConfigurerAdapter 类中,我们使用 protected void configure(HttpSecurity http) 方法为请求添加限制。我想要的是:
我听从了 official documentation 的建议关于如何配置两个单独的 HttpSecurity 实例: @Configuration @EnableWebSecurity public
我费尽心思编写了一个 DSL 来为我的自定义身份验证机制配置 HttpSecurity,但是我对其应用的大部分配置在应用程序运行时似乎都没有生效,而当我在 webapp 中手动配置时,一切都完美无缺。
我总是得到 http 状态 403。我有这个安全配置: @Override protected void configure(HttpSecurity httpSecurity) throws Exc
我是一名优秀的程序员,十分优秀!