Spring Security6 教程

AuthoritiesAuthorizationManager 授权管理器

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 只有自己的权限

 

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号