一、权限表达式
表达式 | 描述 |
---|---|
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层