权限配置
- Spring Security 通用内置表达式
表达式 | 描述 |
---|---|
hasRole([role]) | 如果当前用户具有指定的角色,则返回true, 提供的角色不能以“role”开头,默认Spring Security将添加role |
hasAnyRole([role1,role2]) | 如果当前用户具有任何提供的角色(以逗号分隔的字符串列表形式给出),则返回true 提供的角色不能以“role”开头,默认Spring Security将添加role |
hasAuthority([authority]) | 如果当前用户具有指定的权限,则返回true |
hasAnyAuthority([authority1,authority2]) | 如果当前用户具有提供的任何权限(以逗号分隔的字符串列表形式给出),则返回true |
principal | 允许直接访问principal object,不用current user |
authentication | 允许直接访问从SecurityContext获取的当前身份验证对象 |
permitAll | 任何用户都可以访问 |
denyAll | 任何用户都不可以访问 |
isAnonymous() | 如果当前用户是匿名用户,则返回true |
isRememberMe() | 如果当前用户是remember me用户,则返回true |
isAuthenticated() | 如果用户不是匿名的,则返回true |
isFullyAuthenticated() | 如果用户不是匿名用户或“记住我”用户,则返回true |
hasPermission(Object target, Object permission) | 如果用户有权访问给定权限的所提供目标,则返回true。 例如,hasPermission(domainObject, ‘read’) |
hasPermission(Object targetId, String targetType, Object permission) | 如果用户有权访问给定权限的所提供目标,则返回true。 例如,hasPermission(1, ‘com.example.domain.Message’, ‘read’) |
配置案列
//任何用户都可以访问
http.authorizeRequests().antMatchers("/index").permitAll();
http.authorizeRequests().antMatchers("/index").access("permitAll");]
//任何用户都不能访问
http.authorizeRequests().antMatchers("/home").denyAll();
http.authorizeRequests().antMatchers("/home").access("denyAll");
//认证用户可以访问(除了匿名认证)
http.authorizeRequests().antMatchers("/admin").authenticated();
http.authorizeRequests().antMatchers("/admin").access("authenticated");
//认证用户可以访问(除了匿名认证,记住我)
http.authorizeRequests().antMatchers("/admin").fullyAuthenticated();
http.authorizeRequests().antMatchers("/admin").access("fullyAuthenticated");
//记住我的认证可以访问
http.authorizeRequests().antMatchers("/admin").rememberMe();
http.authorizeRequests().antMatchers("/admin").access("rememberMe");
//匿名用户可以访问
http.authorizeRequests().antMatchers("/admin").anonymous();
http.authorizeRequests().antMatchers("/admin").access("anonymous");
//是否有权限
http.authorizeRequests().antMatchers("/index").hasAuthority("user");
http.authorizeRequests().antMatchers("/index").access("hasAuthority('user')");
//是否有任意一个权限
http.authorizeRequests().antMatchers("/home").hasAnyAuthority("update", "delete", "insert");
http.authorizeRequests().antMatchers("/home").access("hasAnyAuthority('update','delete','insert')");
//spring security中的role并非是一个或多个权限的集合,而是权限的一种,通常以ROLE_开头
//role就是ROLE_开头的权限
//注意:hasRole、hasAnyRole里面的role不需要以ROLE_开头,否则会报异常
//注意:如果在access里面使用hasRole、hasAnyRole则ROLE_前缀可加,可不加
http.authorizeRequests().antMatchers("/index").hasRole("GUEST");
http.authorizeRequests().antMatchers("/index").access("hasRole('GUEST')");
http.authorizeRequests().antMatchers("/admin").hasAuthority("ROLE_GUEST");
http.authorizeRequests().antMatchers("/home").hasAnyRole("GUEST", "USER", "ADMIN");
http.authorizeRequests().antMatchers("/home").access("hasAnyRole('ROLE_GUEST','ROLE_USER','ROLE_ADMIN')");
SpEL表达式
- AuthorityCheck类
@Component("check")
public class AuthorityCheck {
public boolean permitAll(){
return true;
}
public boolean denyAll(){
return false;
}
public boolean req(HttpServletRequest req){
return "1".equals(req.getParameter("type"));
}
public boolean auth(Authentication authentication){
return authentication.getAuthorities().size() > 2;
}
public boolean check(HttpServletRequest req, Authentication authentication){
return "1".equals(req.getParameter("type")) || authentication.getAuthorities().size() > 2;
}
}
- 使用SpEL
//使用SpEL表达式
http.authorizeRequests().antMatchers("/index").access("@check.permitAll()");
http.authorizeRequests().antMatchers("/home").access("@check.denyAll()");
http.authorizeRequests().antMatchers("/index").access("@check.req(request)");
http.authorizeRequests().antMatchers("/index").access("@check.auth(authentication)");
http.authorizeRequests().antMatchers("/index").access("@check.check(request,authentication)");