首页 >Java >java教程 >尽管分配了数据库角色,为什么我的 Spring Security 基于角色的访问控制仍会失败?

尽管分配了数据库角色,为什么我的 Spring Security 基于角色的访问控制仍会失败?

Patricia Arquette
Patricia Arquette原创
2024-12-10 09:29:19357浏览

Why Does My Spring Security Role-Based Access Control Fail Despite Database Role Assignments?

解决 Spring Security 中无效的角色检查

在 Spring Security 中,配置授权有时会导致意外的角色检查。让我们解决所提供的代码片段中突出显示的问题:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    // ...
    auth
        .jdbcAuthentication()
            .dataSource(dataSource)
            .usersByUsernameQuery("select username, password, 1 from users where username=?")
            .authoritiesByUsernameQuery("select users_username, roles_id  from roles_users where users_username=?")
            .rolePrefix("ROLE_");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    // ...
    http
        .csrf().disable();      
    http
        .httpBasic();
    http
        .authorizeRequests()
            .anyRequest().authenticated();
    http
        .authorizeRequests()
            .antMatchers("/users/all").hasRole("admin")
            .and()
        .formLogin();
    http
        .exceptionHandling().accessDeniedPage("/403");
}

问题:

当仅具有“USER”角色的用户登录时,他们能够访问受“admin”角色保护的资源。问题在于“users”表中用户名列的主键约束。

解决方案:

提供的查询“选择用户名,密码, 1 from users where username=?" 是不够的,因为它总是返回单行,无论用户的角色如何。这允许用户承担他们想要的任何角色,即使未在数据库中授予。

要解决此问题,应更新查询以返回用户的角色:

.usersByUsernameQuery("select username, password, role from users where username=?")

附加说明:

授权配置中匹配器的顺序至关重要。以下匹配器 "anyRequest().authenticated() 应位于 antMatchers("/users/all").hasRole("admin") 之前,以确保只有经过身份验证的用户才能访问该应用程序。

以上是尽管分配了数据库角色,为什么我的 Spring Security 基于角色的访问控制仍会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn