configure(httpsecurity-http)和configure(authenticationmanagerbuilder)在websecurityconfigureradapter中被忽略,并带有某些注解

2mbi3lxu  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(361)

我试图保护我的spring应用程序,它有不同的用户角色。虽然身份验证部分设置得很好,而且工作得很完美,但在授权部分的实现过程中,我意识到,通过某些注解,我的系统中的两个重写方法之一 SecurityConfiguration extends WebSecurityConfigurerAdapter class ,将被忽略。

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Autowired
  private WebApplicationContext applicationContext;
  private CredentialsService userDetailsService;

  @Autowired
  private DataSource dataSource;

  @PostConstruct
  public void completeSetup() {
    userDetailsService =   applicationContext.getBean(CredentialsService.class);
  }

  @Override
  protected void configure(final HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/login")
            .permitAll()
            .and()
            .formLogin()
            .permitAll()
            .and()

            .httpBasic()
            .disable()

            .authorizeRequests()
            .antMatchers("/admin", "/admin/**")
            .hasRole("ADMIN")
            .and()

            .authorizeRequests()
            .antMatchers("/employee", "/employee/**")
            .hasRole("EMPLOYEE")
            .and()

            .authorizeRequests()
            .antMatchers("/customer", "/customer/**")
            .hasRole("CUSTOMER");
  }

  @Override
  protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService)
            .passwordEncoder(encoder())
            .and()
            .authenticationProvider(authenticationProvider())
            .jdbcAuthentication()
            .dataSource(dataSource);
  }

  @Bean
  public DaoAuthenticationProvider authenticationProvider() {
    final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(encoder());
    return authProvider;
  }

  @Bean
  public PasswordEncoder encoder() {
    return new BCryptPasswordEncoder(12);
  }
}

现在的问题是,这个类对我的用户进行身份验证,但有一个主要缺点:

configure(final HttpSecurity http) throws Exception {

完全被忽略。
另一方面,如果我在类的顶部添加@configuration注解

protected void configure(final AuthenticationManagerBuilder auth) throws Exception {

完全忽略,因此将破坏授权,因为它将无法在我的自定义服务器上调用getusername()和getpassword UserDetailsService 实施。
如你所见,我用了 DaoAuthenticationProvider 示例作为authenticationprovider,因为我的应用程序从外部数据库检索用户/密码。
我现在采用的快速修复方法是在我的主类上添加以下方法

@EnableGlobalMethodSecurity(
        securedEnabled = true,
        jsr250Enabled = true,
        prePostEnabled = true
)

以及 @Secured 我的受限控制器上的注解。这是可行的,但我想了解为什么spring有如此奇怪的行为,以及我可以采取什么措施来解决这些问题。

2vuwiymt

2vuwiymt1#

由于要为用户分配角色,请使用以下语法

.antMatchers("/admin", "/admin/**")
.hasRole("ADMIN")

.antMatchers("/admin", "/admin/**")
.hasAuthority("ROLE_ADMIN")

角色只存储为带有“role\”前缀的权限。
因此,角色“admin”等同于权限“role\ u admin”。
编辑1
您还可以简化配置,以明确所有内容的来源。
自从你 UserDetailsService ( CredentialsService )已经是豆子了,春安会自动把它捡起来。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  // The password encoder should be a bean
  @Bean
  public PasswordEncoder encoder() {
    return new BCryptPasswordEncoder(12);
  }

  @Override
  protected void configure(final HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/login")
            .permitAll()
            .and()
            .formLogin()
            .permitAll()
            .and()

            .authorizeRequests()
            .antMatchers("/admin", "/admin/**")
            .hasRole("ADMIN")
            .and()

            .authorizeRequests()
            .antMatchers("/manager", "/manager/**")
            .hasRole("MANAGER")
            .and()

            .authorizeRequests()
            .antMatchers("/customer", "/customer/**")
            .hasRole("CUSTOMER");
  }

}

相关问题