我想使用Spring Security进行JWT身份验证。但它带有默认身份验证。我试图禁用它,但是这样做的旧方法 - 通过application.properties
禁用它 - 在2.0中已弃用。
这就是我的尝试:
@Configuration
public class StackWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().disable();
// http.authorizeRequests().anyRequest().permitAll(); // Also doesn't work.
}
}
如何简单地禁用基本安全性?
更新
知道我不是在使用web mvc而是使用web flux。可能会很高兴。
答案 0 :(得分:26)
根据Spring 2.0中的新更新,如果Spring Security在类路径上,Spring Boot将添加@EnnWebSecurity.So向application.properties添加条目将无法工作(即它不再可自定义办法)。有关更多信息,请访问官方网站Security changes in Spring Boot 2.0
虽然不确定您的要求,我可以想到一个解决方法,如下所示: -
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception{
http.authorizeRequests().antMatchers("/").permitAll();
}
}
希望这有帮助。
答案 1 :(得分:8)
这对我有用:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests().anyRequest().permitAll();
}
}
答案 2 :(得分:8)
您可以在Application类中添加/修改以下内容:
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class MyApplication {
}
答案 3 :(得分:7)
According to the reference documentation,允许使用WebFlux的所有请求的安全配置应如下所示:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange().anyExchange().permitAll();
return http.build();
}
}
答案 4 :(得分:3)
从Spring Boot 2.1开始,如果包含spring-boot-actuator,仅排除SecurityAutoconfiguration就不再足够了,还需要排除ManagementWebSecurityAutoConfiguration,如下所示:
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
答案 5 :(得分:1)
我认为您要寻找的是覆盖默认的身份验证入口点,该入口点设置为 BasicAuthenticationEntryPoint 。
此入口点添加
“WWW-Authenticate”:“Basic realm = ...”
标题告诉您的浏览器使用Basic Auth。
答案 6 :(得分:1)
如果我在 application.yml 中将 @ConditionalOnProperty
属性设置为 false 以禁用 spring 安全性,我已经利用 SecurityConfig.java
加载以下 spring.security.enabled
类,并且它的工作原理很吸引人。>
@ConditionalOnProperty(name = "spring.security.enabled", havingValue = "false")
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests().antMatchers("/").permitAll();
}
}
答案 7 :(得分:0)
在Spring boot 2中,无法通过application.properties文件禁用基本身份验证。但是唯一的事情就是使用注释
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})
在主要班级。 有效
答案 8 :(得分:0)
添加一些新的答案,我假设所有人都使用执行器,否则我敢打赌一个类的排除应该足够,我设法通过属性禁用了该功能:
STATIC_URL = '/static/'
STATICFILES_DIRS = [ "cs_viewer/static", ]
STATIC_ROOT="cs_viewer/static"
INSTALLED_APPS += (
'compressor',
'compressor_toolkit',
)
STATICFILES_FINDERS = (
'compressor.finders.CompressorFinder',
)
COMPRESS_CSS_FILTERS = [
'compressor.filters.css_default.CssAbsoluteFilter',
'compressor.filters.cssmin.CSSMinFilter',
'compressor.filters.template.TemplateFilter'
]
COMPRESS_JS_FILTERS = [
'compressor.filters.jsmin.JSMinFilter',
]
COMPRESS_PRECOMPILERS = (
('module', 'compressor_toolkit.precompilers.ES6Compiler'),
('css', 'compressor_toolkit.precompilers.SCSSCompiler'),
)
COMPRESS_ENABLED = True
我通过属性引用了两个自动配置类,以保持长度不变(请注意,如果您这样引用IntelliJ Ultimate,它会哭,因为它不知道这些占位符值是什么,如果它们实际上是合法类,因此,如果您感到烦恼,请直接插入。)
但是,应用程序不会按照以下要求启动:
https://www.baeldung.com/spring-boot-security-autoconfiguration
如果您只是禁用spring:
autoconfigure:
exclude: ${spring.autoconfigure.sac}, ${spring.autoconfigure.mwsas}
sac: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
mwsas: org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration
如果它能正常工作,您将不再看到自动生成的密码,并且比接受的答案要少一些混乱,因为在安全允许的情况下,开发人员读取日志不会被基本身份验证的生成密码所混淆。 / p>
为什么仅禁用主要的自动配置类是不够的,因为这个家伙:
SecurityAutoConfiguration
为分割执行器和安全性配置已经做了很多工作,这使我们所有人都感到困惑,现在它更简单了,但是像这样的工件仍然存在。如果我错了,Spring开发人员会纠正我的:-)。
答案 9 :(得分:0)
问题出在org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter
它有private ServerAuthenticationEntryPoint authenticationEntryPoint = new HttpBasicServerAuthenticationEntryPoint();
因此要在ServerHttpSecurity初始化期间对其进行修复,请添加:
http.exceptionHandling().authenticationEntryPoint(HttpStatusServerEntryPoint(HttpStatus.FORBIDDEN))
看起来像香草(servlet)的spring使用org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer#createDefaultEntryPoint
private AuthenticationEntryPoint createDefaultEntryPoint(H http) {
if (this.defaultEntryPointMappings.isEmpty()) {
return new Http403ForbiddenEntryPoint();
}
if (this.defaultEntryPointMappings.size() == 1) {
return this.defaultEntryPointMappings.values().iterator().next();
}
DelegatingAuthenticationEntryPoint entryPoint = new DelegatingAuthenticationEntryPoint(
this.defaultEntryPointMappings);
entryPoint.setDefaultEntryPoint(this.defaultEntryPointMappings.values().iterator()
.next());
return entryPoint;
}
旁注:构建器样式bean中的可变字段(例如ExceptionTranslationWebFilter)使Spring代码难以调试(也太不可思议了)
答案 10 :(得分:0)
要禁用 Spring Boot Reactive Web 应用程序的默认安全性,请在类路径中也有执行器时使用以下排除项。
@SpringBootApplication(exclude = {ReactiveSecurityAutoConfiguration.class, ReactiveManagementWebSecurityAutoConfiguration.class })
答案 11 :(得分:0)
您应该添加 @EnableWebSecurity
以启用自定义安全配置。
之后只需禁用表单登录
@Configuration
@EnableWebSecurity
public class StackWebSecurityConfigurerAdapter extends
WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().disable();
}
}
答案 12 :(得分:-1)
如果要扩展WebSecurityConfigurerAdapter
,则可以将true
传递给超级构造函数以禁用默认值。
如果这样做,您可能需要提供其他bean。
/**
* Creates an instance which allows specifying if the default configuration should be
* enabled. Disabling the default configuration should be considered more advanced
* usage as it requires more understanding of how the framework is implemented.
*
* @param disableDefaults true if the default configuration should be disabled, else
* false
*/
protected WebSecurityConfigurerAdapter(boolean disableDefaults) {
this.disableDefaults = disableDefaults;
}
如果您仅出于测试目的而将其禁用- 除了完全禁用自动配置之外,我还创建了“ SecurityConfiguration”之外的“ InsecurityConfiguration”,并使用Spring Profile或Property值将其激活。
从技术上讲,安全性仍处于配置状态,但仍处于开放状态。
@Configuration
@ConditionalOnProperty(prefix = "security", value = "disabled", havingValue = "true")
public class InsecurityConfiguration extends WebSecurityConfigurerAdapter {
private final static Logger log = LoggerFactory.getLogger(InsecurityConfiguration.class);
@Override
protected void configure(HttpSecurity http) throws Exception {
log.warn("configuring insecure HttpSecurity");
http.authorizeRequests().anyRequest().permitAll();
}
@Override
public void configure(WebSecurity web) throws Exception {
log.warn("configuring insecure WebSecurity");
web.ignoring().antMatchers("/**");
}
}
注意这是针对mvc而非webflux。对于Webflux,您应该创建一个SecurityWebFilterChain
,如Bryan所述。
这是使用JWT时通常在webflux中禁用基本身份验证的方式-
@Bean
public SecurityWebFilterChain configure(ServerHttpSecurity http) {
http
.authorizeExchange().anyExchange().authenticated().and()
.httpBasic().disable()
.formLogin().disable()
.logout().disable()
.oauth2ResourceServer()
.jwt()
.and()
.and().exceptionHandling().accessDeniedHandler(problemSupport);
return http.build();
}