@EnableGlobalMethodSecurity

  • 在方法上增加Spring Security注解,主要是为了判断当前用户是否有资格执行该方法,如是否拥有某权限、是否为当前登录用户。
  • spring security默认禁用注解,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将AuthenticationManager定义为bean。
  • 提供了三种注解。

    JSR-250注解

  • @DenyAll:拒绝所有访问。
  • @RolesAllowed({“USER”,”ADMIN”}):该方法只要具有USER、ADMIN任意一种权限即可访问。这里省略前缀ROLE_,实际权限可能是ROLE_ADMIN。
  • @PermitAll:允许所有访问。

    prePostEnable注解

  • 开启此注解方法:@EnableGlobalMethodSecurity(prePostEnabled = true)
  • @PreAuthorize:在方法执行前判断,可以调用方法参数,主要利用Java8的参数名反射特性,如果没用Java8也可以使用spring security的@P标注参数,或者Spring Data的@Param标注参数。

    //判断用户是否为当前登录用户或拥有ROLE_ADMIN权限
    @PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
    public void changePassword(@P("userId") long userId ){}
    
  • @PostAuthorize:在方法执行后判断,可以调用参数。如果EL为false,虽然方法已经执行完了也可能会回滚,EL变量returnObject表示返回的对象。

    @PostAuthorize
    User getUser("returnObject.userId == authentication.principal.userId 
        or hasPermission(returnObject, 'ADMIN')");
    
  • @PreFilter:在方法执行前判断,可以调用方法参数,对参数值进行过滤、处理或修改。EL变量filterObject表示参数,如有多个参数则用filterTarget注解参数,那么参数必须是集合或数组才行(很少用到,与分页技术不兼容)。

    securedEnable注解

  • @Secured:是否有权限访问

    @Secured("IS_AUTHENTICATED_ANONYMOUSLY") public Account readAccount(Long id);
    @Secured("ROLE_TELLER")