[SPRING] 스프링 보안에서 역할을 수정하는 방법은 무엇입니까?
SPRING스프링 보안에서 역할을 수정하는 방법은 무엇입니까?
내 프로젝트에서 Spring Security를 사용하려고하는데 여기 코드가있다.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// TODO Auto-generated method stub
//super.configure(auth);
//auth.inMemoryAuthentication().withUser("admin").password("1111").roles("USER");
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");
}
문제는 다음과 같습니다.
우리는 두 명의 사용자 (하나는 사용자 역할을 갖고 다른 하나는 관리자 역할을 가짐)를 데이터베이스 한 명의 관리자로, 두 번째 사용자는 사용자 (사용자 역할 만 가진 사용자)가 액세스 할 수있는 경우를 상상해보십시오 관리자 리소스 (및 예상 된 동작이 아닙니다).
나는이 쿼리에서 문제라고 생각한다.
"select username, password, 1 from users where username=?"
해당 사용자 이름에 따라 기본 키가 있습니까?
누구든지이 문제를 어떻게 해결할 수 있을지 알고 있다면?
해결법
-
==============================
1.matcher의 순서가 중요하기 때문에 첫 번째 matcher anyRequest ()가 항상 적용됩니다. HttpSecurity # authorizeRequests :
matcher의 순서가 중요하기 때문에 첫 번째 matcher anyRequest ()가 항상 적용됩니다. HttpSecurity # authorizeRequests :
수정 및 간소화 된 구성 :
@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .httpBasic() .and() .authorizeRequests() .antMatchers("/users/all").hasRole("admin") .anyRequest().authenticated() .and() .formLogin() .and() .exceptionHandling().accessDeniedPage("/403"); }
-
==============================
2.문제는 HttpSecurity를 구성 할 때 규칙을 정렬하는 것입니다. 무슨 일이 일어나는지는 요청이 들어오고
문제는 HttpSecurity를 구성 할 때 규칙을 정렬하는 것입니다. 무슨 일이 일어나는지는 요청이 들어오고
authorizeRequests().anyRequest().authenticated()
사용자가 인증 되었기 때문에
.antMatchers("/users/all").hasRole("admin")
다음은 구성 방법의 예입니다.
@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .httpBasic() .and() .authorizeRequests() .antMatchers("/public").permitAll() .antMatchers("/user").hasRole("USER") .antMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .and() .exceptionHandling().accessDeniedPage("/403"); }
책임 패턴 체인을 사용합니다. 일치하는 규칙을 찾을 때까지 규칙 체인을 거치게됩니다. 규칙과 일치하는 규칙은 절대로 도달하지 않습니다. 일반적으로 인증 된 요청에 대한 규칙을 작성할 때보다 구체적인 규칙이 우선 적용됩니다.
from https://stackoverflow.com/questions/43052745/how-to-fix-role-in-spring-security by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring의 GA, RC 및 M2 릴리스의 차이점은 무엇입니까? (0) | 2018.12.21 |
---|---|
[SPRING] 거래로 상향 조정 (0) | 2018.12.21 |
[SPRING] Java 8로 WebSphere에서 애플리케이션을 실행할 때 봄 예외 (0) | 2018.12.21 |
[SPRING] Angular2 / Spring Boot는 PUT에 교차점을 허용합니다. (0) | 2018.12.21 |
[SPRING] 스프링 데이터 REST 프로젝트에서 DTO를 사용하는 방법은 무엇입니까? (0) | 2018.12.21 |