在Spring Security中,允许某些端点不进行身份验证

svdrlsy4  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(171)

我正在研究Spring安全性,我希望一些控制器端点应该需要身份验证,一些不需要。我已经创建了一个安全配置。并尝试

  1. @Bean
  2. public SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> securityConfigurerAdapter() {
  3. return new SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity>() {
  4. @Override
  5. public void configure(HttpSecurity http) throws Exception {
  6. http.cors(cor -> {
  7. cor.disable();
  8. }).authorizeHttpRequests(authorizeRequests -> {
  9. authorizeRequests.requestMatchers("/api/**").permitAll()
  10. .requestMatchers("api/login", "api/register")
  11. .permitAll()
  12. .requestMatchers("/api/auth").authenticated();
  13. })
  14. .sessionManagement(sessionManagement -> {
  15. sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  16. }).authenticationProvider(authenticationProvider())
  17. .addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class);
  18. return http.build();
  19. }

字符串
但它仍然是登录和它是给http错误作为403禁止。screen shot of postman
并以Cache miss for ERROR dispatch to '/error' (previous null). Performing MatchableHandlerMapping lookup. This is logged once only at WARN level, and every time at TRACE.的形式给出警告
我试过另一种方法,

  1. @Bean
  2. public SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> securityConfigurerAdapter() {
  3. return new SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity>() {
  4. @Override
  5. public void configure(HttpSecurity http) throws Exception {
  6. http.authorizeHttpRequests(authorizeRequests -> {
  7. authorizeRequests.requestMatchers("/api/application/**").permitAll()
  8. .requestMatchers("api/login", "api/register").permitAll().requestMatchers("/api/auth")
  9. .authenticated();
  10. }).build();
  11. }
  12. };
  13. }


但它给出的错误是403 unathorized。我有关于How to allow certain endpoint in spring security to be allowed without authentication?的信息,但在Spring Boot 3. 2. 0 http.cors()被弃用。

t98cgbkg

t98cgbkg1#

问题是,当错误发生时,Spring会将用户发送到/error端点,但在您的情况下,该端点是受保护的,因此当用户试图访问它时,它会被拒绝,用户会得到403。
允许任何人访问错误端点:

  1. @Bean
  2. public SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> securityConfigurerAdapter() {
  3. return new SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity>() {
  4. @Override
  5. public void configure(HttpSecurity http) throws Exception {
  6. http.cors(cor -> {
  7. cor.disable();
  8. }).authorizeHttpRequests(authorizeRequests -> {
  9. authorizeRequests
  10. .requestMatchers("error").permitAll()
  11. .requestMatchers("/api/**").permitAll()
  12. .requestMatchers("api/login", "api/register")
  13. .permitAll()
  14. .requestMatchers("/api/auth").authenticated();
  15. })
  16. .sessionManagement(sessionManagement -> {
  17. sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  18. }).authenticationProvider(authenticationProvider())
  19. .addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class);
  20. return http.build();
  21. }

字符串

展开查看全部

相关问题