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" 역할만 가진 사용자가 로그인하면 다음을 수행할 수 있습니다. "관리자" 역할로 보호되는 리소스에 액세스합니다. 문제는 "users" 테이블의 사용자 이름 열에 대한 기본 키 제약 조건에 있습니다.
해결책:
제공된 쿼리 "select username,password , 1 username=?" 사용자의 역할에 관계없이 항상 단일 행을 반환하므로 부적절합니다. 이를 통해 사용자는 데이터베이스에 부여되지 않은 경우에도 원하는 역할을 맡을 수 있습니다.
이 문제를 해결하려면 사용자의 역할을 반환하도록 쿼리를 업데이트해야 합니다.
.usersByUsernameQuery("select username, password, role from users where username=?")
추가 참고:
인증 구성에서 일치자의 순서가 중요합니다. 다음 매처 "anyRequest().authenticated()는 인증된 사용자만 애플리케이션에 액세스할 수 있도록 antMatchers("/users/all").hasRole("admin") 앞에 와야 합니다.
위 내용은 데이터베이스 역할 할당에도 불구하고 Spring 보안 역할 기반 액세스 제어가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!