我正在尝试使用Spring安全性来保护Spring启动REST应用程序以进行基本身份验证。
默认的基本身份验证只需插入以下依赖项
即可 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
下一步是使用一些自定义凭据(用户名,密码)覆盖Spring启动提供的默认身份验证凭据。
我试过这个:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
@Autowired
public void configure (AuthenticationManagerBuilder authBuilder) throws Exception {
authBuilder.inMemoryAuthentication()
.withUser("aide").password("aide").roles("USER").and()
.withUser("pervacio").password("pervacio").roles("ADMIN");
}
@Override
@Autowired
protected void configure (HttpSecurity http) throws Exception {
http.httpBasic().and()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/search").hasRole("ADMIN")
.and().csrf().disable();
}
}
这是我的控制器:
@RestController
@SpringBootApplication
public class Controller {
// request mappings and other code here
public static void main(String[] args) {
SpringApplication.run(Controller.class, args);
}
}
我遇到的问题是我无法使用自定义凭据覆盖默认凭据。
我该怎么做?
SO上的其他帖子建议使用configure
注释Autowired
方法,但这对我不起作用。
我做错了什么?我按照official example。
尝试了上述方法答案 0 :(得分:1)
我意识到的问题是SecurityConfiguration
的位置(或包)。
@ComponentScan
注释(包含在@SpringBootApplication
的一部分中)扫描定义它的同一包中的组件。
因此,有两种解决方案:a)将配置移动到定义注释的同一个包中b)配置注释以扫描放置配置的包中的组件
就我而言,与我的应用程序类相比,上面的SecurityConfiguration
文件位于不同的包中。
解决方案a :
包括以下注释:
@ComponentScan({"<security-package-name>"})
并插入具有安全配置的软件包的名称。
解决方案b :
将Java配置类移动到与应用程序类相同的包中。