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

如何禁用特定endpoint的身份验证?

柳越
2023-03-14
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/chores");
}
@SpringBootTest
@AutoConfigureMockMvc
public class ChoreApplicationTest
{
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void choresShouldBeEmptyAtStart() throws Exception
    {
        this.mockMvc.perform(get("/chores")).
                andExpect(status().isOk());
    }
java.lang.AssertionError: Status expected:<200> but was:<401>
Expected :200
Actual   :401
@Configuration
@EnableWebSecurity
public class SecurityConfigurer extends WebSecurityConfigurerAdapter
{
    @Override
    public void configure(WebSecurity web) throws Exception
    {
        web.ignoring().antMatchers("/chores");
        super.configure(web);
    }
}

我想你可以想象家务控制器中有什么,但为了完整起见,这里有相关的部分:

@RestController
public class ChoreController
{
    private final ChoreRepository repository;

    ChoreController(ChoreRepository repository)
    {
        this.repository = repository;
    }

    @GetMapping("/chores")
    List<Chore> all()
    {
        return this.repository.findAll();
    }
}

下面是测试在输出中打印的请求:

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /chores
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {SPRING_SECURITY_SAVED_REQUEST=DefaultSavedRequest[http://localhost/chores]}

那么,为什么我的测试会得到401的返回代码,我如何修复它?

共有1个答案

淳于思淼
2023-03-14

安全配置在configure(WebSecurity web)中是正确的,但问题是SecurityConfigurer由于包不同而无法调用

Spring Boot从主应用程序即ChoreApplication开始执行,还请注意,除了SecurityConfigurer(包安全)之外,所有类都在包托管中

我们的主应用程序类由@springbootapplication组成,其中

@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan

默认情况下,spring会处理包杂务中的所有类,这里的问题是spring不知道其他包中的类。在包安全性中securityconfigurer

为了调用securityconfigurer,我们必须在@componentscan(basePackages={“chores”,“security”})中添加安全包

ChoreApplication.java

package chores;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"chores", "security"})
public class ChoreApplication
{
    public static void main(String args[])
    {
        SpringApplication.run(ChoreApplication.class, args);
    }
}
package security;

import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/chores");
    }
}

你可能喜欢探索

Spring Security配置:HttpSecurity-vs-Webecurity

如何使用@ComponentScan注释扫描多个路径

 类似资料:
  • 我有一个Spring Boot应用程序与Spring Security。将配置新的终结点,以便通过基本HTTP身份验证进行访问。当前的配置如下: } 如何为添加base auth?我想我需要这样的东西,但我不认为这是完全正确的,我真的不明白到底在哪里添加它: 我发现这些资源很有帮助,但还不够: http://www.baeldung.com/spring-security-basic-authen

  • 有没有办法对/oauth/tokenendpoint禁用HTTP基本身份验证?我希望在JSON主体或请求头中发送client_id和client_secret。 我想工作的卷曲例子: 或

  • 我想为登录创建自定义endpoint。 当密码和用户名正确时,它可以正常工作,但对于不正确的数据返回200和登录表单而不是401。 public-class-SecurityConfiguration扩展了WebSecurityConfigurerAdapter{private-final-UserDetailsService-UserDetailsService; }

  • 我正在尝试使用Keycloak配置Spring Boot应用程序以使其具有可供经过身份验证和未经身份验证的用户访问的endpoint。对于经过身份验证的用户,我想返回一些额外信息。这是我试图实现的一个简单示例: application.properties: 到目前为止,我只对这两种情况中的一种起作用。如果我使用上面的安全约束保护endpoint,那么只有经过身份验证的用户才能访问该endpoin

  • 我需要通过LDAP(AD)为我们的Jenkins设置身份验证。我能够大规模地设置身份验证,但我必须将其缩小到某个组的某个成员,我的LDAP过滤在这里失败。 这是我要针对的完整DN: CN=jenkins组,OU=App 1,OU=应用程序,OU=公司组,OU=公司,DC=我的,DC=域,DC=com 在jenkinsgroup组中,我将用户存储为成员属性,只有他们才能访问。 Jenkins LDA