1. 何谓授权?
所谓的授权,就是用户如果要访问某一个资源,我们要去检查用户是否具备这样的权限,如果具备就允许访问,如果不具备,则不允许访问。
2. 准备测试用户
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("itming").password("123").roles("admin")
.and()
.withUser("lisi").password("123").roles("user");
}
3. 准备测试接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello World!";
}
@GetMapping("/admin/hello")
public String admin() {
return "Hello admin!";
}
@GetMapping("/user/hello")
public String user() {
return "Hello user!";
}
}
/hello
:任何人都可以访问该接口/admin/hello
:具有 admin 角色的人才能访问该接口/user/hello
:具有 user 角色的人才能访问该接口- 所有角色 user 能够访问的资源,角色 admin 都能够访问
4. 配置拦截规则
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("admin")
.antMatchers("/user/**").hasRole("user")
.anyRequest().authenticated()
.and()
- 如果请求路径满足
/admin/**
格式,则用户需要具备 admin 角色。 - 如果请求路径满足
/user/**
格式,则用户需要具备 user 角色。 - 剩余的其他格式的请求路径,只需要认证(登录)后就可以访问。
5. 角色继承
为了实现 user 能访问的资源 admin 都可以访问这一功能,我们需要依靠角色继承,代码如下:
@Bean
RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_admin > ROLE_user");
return roleHierarchy;
}