1. 程式人生 > >Spring Security @PreAuthorize 攔截無效

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許可權的使用者去訪問此方法發現無效。

修改一下 SecurityConfig:

  @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(prePostEnabled=true) 註解來開啟。

並且需要提供以下方法:

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
  return super.authenticationManagerBean();
}

才可正常攔截。