HttpSecurity,WebSecurity和AuthenticationManagerBuilder


Answers:


125

configure(AuthenticationManagerBuilder)用于通过允许轻松添加AuthenticationProviders来建立身份验证机制:例如,以下内容定义了带有内置“用户”和“管理员”登录名的内存中身份验证。

public void configure(AuthenticationManagerBuilder auth) {
    auth
        .inMemoryAuthentication()
        .withUser("user")
        .password("password")
        .roles("USER")
    .and()
        .withUser("admin")
        .password("password")
        .roles("ADMIN","USER");
}

configure(HttpSecurity)允许基于选择匹配在资源级别配置基于Web的安全性-例如,以下示例将以/ admin /开头的URL限制为具有ADMIN角色的用户,并声明需要使用其他任何URL成功认证。

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated()
}

configure(WebSecurity)用于影响全局安全性的配置设置(忽略资源,设置调试模式,通过实现自定义防火墙定义拒绝请求)。例如,以下方法将导致以/ resources /开头的任何请求都被忽略,以进行身份​​验证。

public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**");
}

您可以参考以下链接以获取更多信息Spring Security Java Config Preview:Web安全


2
尼克,很好的回答。使用spring-security-config-5.0.3(随spring-boot 2.0.0一起提供),我找不到该方法http.authorizeUrls(),也许它早已被重命名http.authorizeRequests()
义欧

5
我知道这很旧,但是这里的最佳做法是什么?我已经找到了调用http.antMatchers(“ / foo”)。permitAll()“的configure(HttpSecurity http)方法实现的示例,这似乎等同于configure(WebSecurity)调用web.ignoring()。antMatchers(” / foo“)网络)方法
chrisinmtown,

好答案。我想知道我们是否需要在HttpSecurity上调用allowAll?我们不能仅使用WebSecurity忽略所有打开的url,例如/ register或/ login吗?那么,为什么所有教程或答案都对/ register和/ login使用HttpSecurity.permitAll而对/ resources的/ publics使用WebSecurity.ingore?–
Mohd Waseem

3

WebSecurity ignoring()方法的常规用法省略了Spring Security,并且Spring Security的功能均不可用。WebSecurity基于HttpSecurity。

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**")
        .antMatchers("/publics/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/publics/**").hasRole("USER") // no effect
        .anyRequest().authenticated();
}

上面的示例中的WebSecurity让Spring忽略/resources/**/publics/**。因此.antMatchers("/publics/**").hasRole("USER"),不考虑 HttpSecurity中的。

这将完全省略来自安全过滤器链的请求模式。请注意,与此路径匹配的所有内容都将不应用身份验证或授权服务,并且可以自由访问。

configure(HttpSecurity)允许根据选择匹配在资源级别配置基于Web的安全性-例如,以下示例将以URL开头的URL限制为/admin/具有ADMIN角色的用户,并声明需要成功进行身份验证的所有其他URL

configure(WebSecurity)用于影响全局安全性的配置设置(忽略资源,设置调试模式,通过实现自定义防火墙定义拒绝请求)。例如,以下方法将导致以身份验证为开头的所有请求/resources/都被忽略

AuthenticationManagerBuilder
extends AbstractConfiguredSecurityBuilder<AuthenticationManager,AuthenticationManagerBuilder>
implements ProviderManagerBuilder<AuthenticationManagerBuilder>

用于创建的SecurityBuilder AuthenticationManager。允许轻松构建内存身份验证,LDAP身份验证,基于JDBC的身份验证,添加UserDetailsS​​ervice以及添加AuthenticationProvider

@Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
        auth.userDetailsService(customUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
     }

好答案。我想知道我们是否需要在HttpSecurity上调用allowAll?我们不能仅使用WebSecurity忽略所有打开的url,例如/ register或/ login吗?那么,为什么所有教程或答案都对/ register和/ login使用HttpSecurity.permitAll而对/ resources的/ publics使用WebSecurity.ingore?
Mohd Waseem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.