第五章 细粒度权限控制
5.1 前置细节【Role和Authority的区别】
5.1.1 用户拥有的权限表示
- roles("ADMIN","学徒","宗师")
- authorities("USER","MANAGER");
5.1.2 给资源授予权限(角色或权限)
//.antMatchers("/level1/**").hasRole("学徒") //.antMatchers("/level1/**").hasAnyRole("学徒","ADMIN")//拥有任何一个角色都可以访问 .antMatchers("/level1/**").hasAnyAuthority("学徒","ADMIN") //拥有任何一个权限都可以访问 .antMatchers("/level2/**").hasRole("大师") .antMatchers("/level3/**").hasRole("宗师") |
5.1.3 权限:【roles和authorities区别】
- roles("ADMIN","学徒","宗师")
增加"ROLE_"前缀存放:【"ROLE_ADMIN","ROLE_学徒","ROLE_宗师"】
表示拥有的权限。一个角色表示的是多个权限
用户传入的角色不能以ROLE_开头,否则会报错。ROLE_是自动加上的
如果我们保存的用户的角色:直接传入角色的名字,权限【new SimpleGrantedAuthority("ROLE_" + role)】保存即可
- authorities("USER","MANAGER");
原样存放:【"USER","MANAGER"】
表示拥有的权限。
如果我们保存的是真正的权限;直接传入权限名字,权限【new SimpleGrantedAuthority(role)】保存
无论是Role还是Authority都保存在 List<GrantedAuthority>,每个用户都拥有自己的权限集合->List<GrantedAuthority>
5.1.4 验证用户权限
- 通过角色(权限)验证:
.antMatchers("/level1/**").hasRole("学徒")
.antMatchers("/level1/**").hasAnyRole("学徒","ADMIN")
拥有任何一个角色都可以访问
验证时会自动增加"ROLE_"进行查找验证:【"ROLE_学徒","ROLE_ADMIN"】
通过权限验证
.antMatchers("/level1/**").hasAuthority("学徒")
.antMatchers("/level1/**").hasAnyAuthority("学徒","ADMIN")
拥有任何一个权限都可以访问
验证时原样查找进行验证:【"学徒","ADMIN"】
5.2 细粒度的资源控制
- authenticated():通过认证的用户都可以访问
- permitAll():允许所有人访问,即使未登录
- authorizeRequests():更细粒度的控制
- access(String):
//SpEL:Spring表达式
.access("hasRole('