Spring Security permitAll()에서 익명 접근 을 허용 하지 않 는 동작

Spring Security permitAll()에 서 는 익명 접근 을 허용 하지 않 습 니 다.
수정 전

 http
        .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
        .addFilterBefore(cf, ChannelProcessingFilter.class)
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");
수정 후

 http
        .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
        .addFilterBefore(cf, ChannelProcessingFilter.class)
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");
permitAll()순 서 는 XML 설정 에서 authorizeRequests().anyRequest().authenticate 를 마지막 으로 하 는 것 과 같이 매우 중요 합 니 다.
Spring Security@PreAuthorize 차단 이 잘못 되 었 습 니 다.
1.spring security 를 사용 할 때 주석 사용

@PreAuthorize("hasAnyRole('ROLE_Admin')")
방법 에 대한 접근 권한 을 제어 할 수 없습니다.다음 과 같이 설정 합 니 다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired
    UserDetailsService userDetailsService;
 
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/res/**", "/login/login*").permitAll()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login/login").defaultSuccessUrl("/")
                .passwordParameter("password")
                .usernameParameter("username")
            .and().logout().logoutSuccessUrl("/login/login");
    }
}
Controller 의 방법 은 다음 과 같 습 니 다.

@Controller
@RequestMapping("/demo")
public class DemoController extends CommonController{
    @Autowired
    private UserService userService;
 
    @PreAuthorize("hasAnyRole('ROLE_Admin')")
    @RequestMapping(value = "user-list")
    public void userList() {
         
    }
}
하나 사용 하기 ROLE 없 음Admin 권한 을 가 진 사용자 가 이 방법 에 접근 하 는 것 이 잘못 되 었 습 니 다.
Security Config 수정:

  @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.csrf().disable()
           .authorizeRequests()
           .antMatchers("/res/**", "/login/login*").permitAll()
           .antMatchers("/demo/user-list").access("hasRole('ROLE_Admin')")
           .anyRequest().authenticated()
           .and().formLogin().loginPage("/login/login").defaultSuccessUrl("/")
               .passwordParameter("password")
               .usernameParameter("username")
           .and().logout().logoutSuccessUrl("/login/login");
   }
추가:

.antMatchers("/demo/user-list").access("hasRole('ROLE_Admin')")
정상적으로 차단 할 수 있다 는 것 은 방법 이 차단 되 지 않 았 다 는 것 을 의미한다.
xml 기반 이 라면 설정 파일 에 다음 을 추가 해 야 합 니 다.

<security:global-method-security pre-post-annotations="enabled" proxy-target-class="true" />
Annotation 방식 으로 바 뀌 면@EnableGlobalMethodSecurity(prePost Enabled=true)주 해 를 사용 하여 열 어야 합 니 다.
그리고 다음 과 같은 방법 을 제공 해 야 한다.

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
  return super.authenticationManagerBean();
}
제대로 차단 할 수 있 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기