Java 删除“;使用默认安全密码";弹簧靴
我在Spring Boot的应用程序中添加了一个自定义的安全配置,但是日志文件中仍然有关于“使用默认安全密码”的消息 有什么方法可以移除它吗?我不需要这个默认密码。Spring Boot似乎没有识别我的安全策略Java 删除“;使用默认安全密码";弹簧靴,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我在Spring Boot的应用程序中添加了一个自定义的安全配置,但是日志文件中仍然有关于“使用默认安全密码”的消息 有什么方法可以移除它吗?我不需要这个默认密码。Spring Boot似乎没有识别我的安全策略 @Configuration @EnableWebSecurity public class CustomSecurityConfig extends WebSecurityConfigurerAdapter { private final String uri = "/cus
@Configuration
@EnableWebSecurity
public class CustomSecurityConfig extends WebSecurityConfigurerAdapter {
private final String uri = "/custom/*";
@Override
public void configure(final HttpSecurity http) throws Exception {
http.csrf().disable();
http.headers().httpStrictTransportSecurity().disable();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// Authorize sub-folders permissions
http.antMatcher(uri).authorizeRequests().anyRequest().permitAll();
}
}
查阅:
通过查看代码,我看到了下面的内容。此外,如果没有按照提供身份验证管理器,则内存中的配置也是一种后备配置。您先前注入身份验证管理器的尝试将起作用,因为您将不再使用内存中的身份验证,并且该类将无法使用
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
if (auth.isConfigured()) {
return;
}
User user = this.securityProperties.getUser();
if (user.isDefaultPassword()) {
logger.info("\n\nUsing default security password: " + user.getPassword()
+ "\n");
}
Set<String> roles = new LinkedHashSet<String>(user.getRole());
withUser(user.getName()).password(user.getPassword()).roles(
roles.toArray(new String[roles.size()]));
setField(auth, "defaultUserDetailsService", getUserDetailsService());
super.configure(auth);
}
@覆盖
public void configure(AuthenticationManagerBuilder auth)引发异常{
if(auth.isConfigured()){
返回;
}
User User=this.securityProperties.getUser();
if(user.isDefaultPassword()){
logger.info(“\n\n使用默认安全密码:”+user.getPassword()
+“\n”);
}
Set roles=newlinkedhashset(user.getRole());
withUser(user.getName()).password(user.getPassword()).roles(
roles.toArray(新字符串[roles.size()]);
setField(auth,“defaultUserDetailsService”,getUserDetailsService());
super.configure(auth);
}
如果使用默认的内存身份验证,请自定义org.springframework.boot.autoconfigure.security.authenticationmanager配置的记录器配置,并删除此消息。我找到了排除安全自动配置的解决方案 例如:
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
public class ReportApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(MyApplication.class, args);
}
}
在
application.properties
中添加以下内容对我很有效
security.basic.enabled=false
请记住重新启动应用程序并在控制台中进行检查。尽管它可以工作,但正如一些评论中所指出的,当前的解决方案有点过头了。因此,这里有一个适合我的替代方案,使用最新的Spring Boot(1.4.3) 默认安全密码在Spring Boot的类中配置。如果已定义AuthenticationManager Bean,则此类具有条件注释以防止加载 由于我们将当前AuthenticationManager定义为一个bean,因此下面的代码可以防止AuthenticationManager配置内的代码执行
@Configuration
@EnableWebSecurity
public class MyCustomSecurityConfig extends WebSecurityConfigurerAdapter{
[...]
@Override
protected void configure(AuthenticationManagerBuilder authManager) throws Exception {
// This is the code you usually have to configure your authentication manager.
// This configuration will be used by authenticationManagerBean() below.
}
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
// ALTHOUGH THIS SEEMS LIKE USELESS CODE,
// IT'S REQUIRED TO PREVENT SPRING BOOT AUTO-CONFIGURATION
return super.authenticationManagerBean();
}
}
当使用spring boot时,我们应该排除应用程序类中的SecurityAutoConfiguration.class以及您正在配置安全性的确切位置,如下所示 那么只有我们才能避免默认的安全密码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
@EnableJpaRepositories
@EnableResourceServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
检查org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration的文档自动配置在某些情况下自动配置将停止 在我的例子中,我忘记将我的自定义身份验证提供程序定义为bean
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(getAuthenticationProvider());
}
@Bean
AuthenticationProvider getAuthenticationProvider() {
return new CustomAuthenticationProvider(adminService, onlyCorporateEmail);
}
}
当我使用@SpringBootApplication annotation排除SecurityAutoConfiguration时,它对我不起作用,但当我在@EnableAutoConfiguration中排除它时,它确实起作用:
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange().anyExchange().permitAll();
return http.build();
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
如果您使用的是Spring引导版本>=2.0,请尝试在配置中设置此bean:
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange().anyExchange().permitAll();
return http.build();
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
参考资料:使用Spring Boot 2.0.4时,我遇到了相同的问题 排除
SecurityAutoConfiguration.class
会破坏我的应用程序
现在我正在使用@SpringBootApplication(exclude={UserDetailsServiceAutoConfiguration.class})
如果要在单独的包中声明配置,则可以使用
@EnableResourceServer
和JWT:)
,
确保按如下方式添加组件扫描:
@SpringBootApplication
@ComponentScan("com.mycompany.MY_OTHER_PACKAGE.account.config")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
您可能还需要在config类中添加@component注释,如下所示:
@Component
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.....
在使用webflux的spring boot 2上,您需要定义一个反应式AuthenticationManager也可以在属性中关闭该特定类的日志记录:
logging.level.org.springframework.boot.autoconfigure.security.AuthenticationManagerConfiguration=WARN
只需使用以下行:
spring.security.user.name=XXX
spring.security.user.password=XXX
设置默认安全用户名和密码的步骤
在Spring应用程序上下文中的应用程序.properties
(名称可能不同)
要完全避免默认配置(作为SpringBoot自动配置的一部分),请使用前面答案中提到的方法:
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
或
对于反应堆栈(SpringWebFlux,Netty),您需要排除ReactiveUserDetailsServiceAutoConfiguration.class
@SpringBootApplication(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class})
或者定义ReactiveAuthenticationManager bean(有不同的实现,这里是JWT的一个示例)
我遇到了同样的问题,将这一行添加到我的应用程序中。属性解决了这个问题
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
它是弹簧的一个自动部件,你可以将它排除在外,就像排除其他部件,如执行器一样。我建议查看此要删除默认用户,您需要在没有用户的情况下配置authentication menager,例如:
@configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication();
}
}
这将删除默认密码消息和默认用户,因为在这种情况下,您将在MemoryAuthentication中配置,并且在接下来的步骤中不会指定任何用户。在Spring Boot 2应用程序中,您可以从自动配置中排除服务配置:
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange().anyExchange().permitAll();
return http.build();
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
或者,如果您只想在日志中隐藏消息,只需更改日志级别:
logging.level.org.springframework.boot.autoconfigure.security=WARN
更多信息可在此处找到:如果您已启用执行器功能(弹簧启动启动器执行器),则应在application.yml中添加其他排除项:
spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration
在Spring Boot 2.3.4版中测试。您只需要排除UserDetails服务自动配置
spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
只需将下面的属性添加到application.properties
spring.security.user.name=xyz
spring.security.user.password=xxxxxxx
该类是否在正确的包中,因此可以找到?几个月前我犯了这个错误。。。将密码设置为已知值(I a)是否足够