springsecurity授权

一、权限表达式

表达式描述
permitAll() 总是返回true,表示允许所有访问(认证不认证都可访问 URL或方法)
denyAll() 总是返回false,表示拒绝所有访问(永远访问不到指定的 URL或方法)
isAnonymous() 当前用户是一个匿名用户(未登录用户)允许访问,返回true
isRememberMe() 当前用户是通过Remember-Me自动登录的允许访问,返回true
isAuthenticated() 当前用户是已经登录认证成功的允许访问(包含了rememberMe自动登录的),返回true
isFullyAuthenticated() 如果当前用户既不是一个匿名用户,同时也不是通过Remember-Me自动登录的,则允许访问(可以理解为通过页面输入帐户信息认证的)。
hasRole(String role) 当前用户拥有指定角色权限的允许访问,返回true。注意: 指定的角色名(如: ADMIN ) SpringSecurity 底层会在前面拼接 ROLE_ 字符串,所以在UserDetailsService实现类,数据库返回的角色名要有ROLE_ADMIN
hasAnyRole([role1, role2]) 多个角色以逗号分隔的字符串。如果当前用户拥有指定角色中的任意一个则允许访问,返回true。
hasAuthority(String authority) 当前用户拥有指定权限标识的允许访问,返回true。注意:和 hasRole区别是, hasAuthority 不会在前面拼接 ROLE_ 字符串, 。
hasAnyAuthority([auth1,auth2]) 多个权限标识是以逗号分隔的字符串。如果当前用户拥有指定权限标识中的任意一个则允许访问,返回true
hasIpAddress("192.168.1.1/29") 限制指定IP或指定范围内的IP才可以访问

  示例:

config
    .and().authorizeRequests()
    .antMatchers("/static").permitAll()
    .antMatchers("/user").hasAnyAuthority("sys:user", "sys:auth")
    .antMatchers("/role").hasAnyRole("ADMIN", "ROOT")
    .antMatchers(HttpMethod.GET, "/auth")
    .access("hasAuthority('sys:user') or hasRole('ADMIN')")
    .anyRequest().authenticated()

service
    new User(username, password,
        AuthorityUtils.commaSeparatedStringToAuthorityList("sys:user,sys:auth,ROLE_ADMIN,ROLE_ROOT"))

二、基于注解控制方法级权限

1、开启方法级权限控制(SpringSecurityConfig)

@EnableGlobalMethodSecurity(prePostEnabled = true)

2、注解

注解描述
@PreAuthorize(表达式) 在方法调用前进行权限检查,表达式为true允许调用,反之则无权限调用
@PostAuthorize(表达式) 在方法调用后进行权限检查,如果表达式计算结果为false,抛出异常403不允许访问。returnObject代表方法的返回值,可以使用returnObject对方法返回值进行验证
@PreFilter(表达式) 允许方法调用,但必须在进入方法之前过滤方法参数值。
@PostFilter(表达式) 允许方法调用,但必须按照表达式来过滤方法的返回值。returnObject代表方法的返回值,可以使用returnObject对方法返回值进行验证

  示例:

@PreAuthorize("hasRole('ADMIN')")
@RequestMapping("/preAuthorize")
@ResponseBody
public Msg preAuthorize() {
    return Msg.success();
}

@PostAuthorize("returnObject.code == 200")
@RequestMapping("/postAuthorize")
@ResponseBody
public Msg postAuthorize() {
    return Msg.success();
}

// 过滤请求参数:filterTarget 指定哪个参数,filterObject是集合中的每个元素,
// 如果value表达式为true的数据则不会被过滤,否则 就过滤掉
@PreFilter(filterTarget = "list", value = "filterObject > 1")
@RequestMapping("/preFilter/{list}")// /preFilter/1,2,3
@ResponseBody
public Msg preFilter(@PathVariable List<Integer> list) {
    return Msg.success().add("list", list);
}

// 过滤返回值:filterObject是返回值集合中的每一个元素,当表达式为true则对应元素会返回
@PostFilter("filterObject > 1")
@RequestMapping("/postFilter")
@ResponseBody
public Object postFilter() {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    return list;
}

备注:

  1、注解方式可以控制controller层和service层,配置方式只可以控制controller层

原文地址:https://www.cnblogs.com/linding/p/14028436.html