AuthoritiesAuthorizationManager 类基于角色或权限(authorities)进行授权决策,检查用户是否具有指定的角色或权限才能访问受保护的资源。
AuthoritiesAuthorizationManager 类接收一个 Authentication 对象(当前用户的认证信息)和一个权限集合,通过角色层级(RoleHierarchy)系统获取用户实际拥有的所有可访问权限。然后,检查这些权限中是否包含任何一个请求的权限。如果匹配到任何一个权限,则授权成功;否则授权失败。
AuthoritiesAuthorizationManager 类的核心功能如下:
基于权限的授权检查:检查当前用户的认证信息中是否包含任何指定的权限 (authorities)
支持角色层级:通过 RoleHierarchy 接口支持角色继承关系,如 ROLE_ADMIN 可以自动获得 ROLE_USER 的权限
灵活的配置:可以自定义角色层级关系,默认使用 NullRoleHierarchy(即无层级关系)
下面演示如何在 access() 方法中使用 AuthoritiesAuthorizationManager 类,代码如下:
http.authorizeHttpRequests(authorize -> authorize // 需要具有 admin 角色权限或者拥有 menu:sys:delete 权限才能访问 /sys 路径的请求 .requestMatchers("/sys/**").access((authentication, context) -> new AuthoritiesAuthorizationManager().check(authentication, Arrays.asList("role_admin", "menu:sys:delete"))) .anyRequest().authenticated() // 其他请求需认证 )
配置角色层级关系(可选的),如下:
@Configuration @EnableWebSecurity public class SecurityConfig { // ... @Bean public RoleHierarchy roleHierarchy() { RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); // 定义角色层级:ROLE_ADMIN 继承 ROLE_USER 的所有权限 roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER"); return roleHierarchy; } }
注意,角色层级 (Role Hierarchy) 允许你定义角色之间的继承关系,使得拥有高级角色的用户自动获得低级角色的所有权限。上述代码:
> 符号表示 "继承" 关系,左边的角色继承右边角色的所有权限。
ROLE_ADMIN > ROLE_USER 意味着:
拥有 ROLE_ADMIN 角色的用户自动获得 ROLE_USER 的所有权限
当系统检查用户是否拥有 ROLE_USER 权限时,拥有 ROLE_ADMIN 的用户也会通过检查
但反过来不成立:拥有 ROLE_USER 的用户不会自动获得 ROLE_ADMIN 的权限
你还可以定义更复杂的层级关系:
roleHierarchy.setHierarchy( "ROLE_SUPERADMIN > ROLE_ADMIN \n" + "ROLE_ADMIN > ROLE_EDITOR \n" + "ROLE_EDITOR > ROLE_USER" );
这将创建一个四级角色层级:
SUPERADMIN 拥有 ADMIN、EDITOR 和 USER 的所有权限
ADMIN 拥有 EDITOR 和 USER 的权限
EDITOR 拥有 USER 的权限
USER 只有自己的权限