Spring 安全性 - POST antMatcher 的方法(不是 antMatchers)
Spring Security - POST method for antMatcher (not antMatchers)
我有两个配置:
@订单(1)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().hasRole("USER")
.and()
.httpBasic()
.and()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.exceptionHandling()
.authenticationEntryPoint(new ApiAuthenticationEntryPoint(objectMapper));
}
@订单(2)
http.authorizeRequests()
.antMatchers("/product/**").hasRole(SecurityRoles.USER)
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/authenticateTheUser")
.successHandler(customAuthenticationSuccessHandler)
.permitAll()
.and()
.logout()
.permitAll()
.and()
.exceptionHandling()
.accessDeniedPage("/access-denied");
我需要添加功能以在没有身份验证的情况下使用 REST 端点 /api/users
注册新用户。其他 /api/**
端点应保留基本身份验证。这该怎么做?我看不到带有选择 http 方法类型选项的方法 antMatcher
。
编辑:
我需要这样的东西:
http.antMatcher("/api/users", HttpMethod.POST.toString).permitAll()
.and()
.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().hasRole("USER")
(...)
不过您可以使用 antMatchers()
做到这一点:
http
.antMatcher("/api/**")
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/api/user").permitAll()
.anyRequest().hasRole("USER")
antMatcher(..)
和 antMatchers(..)
之间的区别在于,当您有单独的安全配置 class 时,您使用 antMatcher(..)
。当您需要区分以下内容时,这可能是必要的:
- 身份验证机制(表单登录、基本身份验证...)
- CSRF 处理
- 会话管理
- 过滤器
- 用户详情服务
- ...
另一方面,antMatchers(..)
(在 authorizeRequests(..)
内)用于区分授权级别(哪些角色可以访问特定端点)。
在你的情况下,配置属于后者,因为你只需要区分 POST /api/user
端点的权限。
但是,如果您确实需要更精细地控制应该应用的安全配置 class,那么您应该使用评论中提到的 RequestMatcher
。
此界面有一个 HttpServletRequest
参数,并希望您 return 一个 boolean
。由于 HttpServletRequest
包含您需要的所有信息,例如路径和 HTTP 方法,您可以适当调整 class 应该应用的配置。但是,在这种情况下没有必要。
我有两个配置:
@订单(1)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().hasRole("USER")
.and()
.httpBasic()
.and()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.exceptionHandling()
.authenticationEntryPoint(new ApiAuthenticationEntryPoint(objectMapper));
}
@订单(2)
http.authorizeRequests()
.antMatchers("/product/**").hasRole(SecurityRoles.USER)
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/authenticateTheUser")
.successHandler(customAuthenticationSuccessHandler)
.permitAll()
.and()
.logout()
.permitAll()
.and()
.exceptionHandling()
.accessDeniedPage("/access-denied");
我需要添加功能以在没有身份验证的情况下使用 REST 端点 /api/users
注册新用户。其他 /api/**
端点应保留基本身份验证。这该怎么做?我看不到带有选择 http 方法类型选项的方法 antMatcher
。
编辑:
我需要这样的东西:
http.antMatcher("/api/users", HttpMethod.POST.toString).permitAll()
.and()
.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().hasRole("USER")
(...)
不过您可以使用 antMatchers()
做到这一点:
http
.antMatcher("/api/**")
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/api/user").permitAll()
.anyRequest().hasRole("USER")
antMatcher(..)
和 antMatchers(..)
之间的区别在于,当您有单独的安全配置 class 时,您使用 antMatcher(..)
。当您需要区分以下内容时,这可能是必要的:
- 身份验证机制(表单登录、基本身份验证...)
- CSRF 处理
- 会话管理
- 过滤器
- 用户详情服务
- ...
另一方面,antMatchers(..)
(在 authorizeRequests(..)
内)用于区分授权级别(哪些角色可以访问特定端点)。
在你的情况下,配置属于后者,因为你只需要区分 POST /api/user
端点的权限。
但是,如果您确实需要更精细地控制应该应用的安全配置 class,那么您应该使用评论中提到的 RequestMatcher
。
此界面有一个 HttpServletRequest
参数,并希望您 return 一个 boolean
。由于 HttpServletRequest
包含您需要的所有信息,例如路径和 HTTP 方法,您可以适当调整 class 应该应用的配置。但是,在这种情况下没有必要。