복붙노트

[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. ==============================

    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. ==============================

    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");
    }
    

    책임 패턴 체인을 사용합니다. 일치하는 규칙을 찾을 때까지 규칙 체인을 거치게됩니다. 규칙과 일치하는 규칙은 절대로 도달하지 않습니다. 일반적으로 인증 된 요청에 대한 규칙을 작성할 때보다 구체적인 규칙이 우선 적용됩니다.

  3. from https://stackoverflow.com/questions/43052745/how-to-fix-role-in-spring-security by cc-by-sa and MIT license