Skip to content

基于request的授权

1. 用户-权限-资源结构

需求:
- 具有USER_LIST权限的用户可以访问/user/list接口
- 具有USER_ADD权限的用户可以访问/user/add接口

1.1 配置WebSecurityConfig

配置WebSecurityConfig:

java
//开启授权保护
http.authorizeRequests(
    authorize -> authorize
            //具有USER_LIST权限的用户可以访问/user/list
            .requestMatchers("/user/list").hasAuthority("USER_LIST")
            //具有USER_ADD权限的用户可以访问/user/add
            .requestMatchers("/user/add").hasAuthority("USER_ADD")
            //对所有请求开启授权保护
            .anyRequest()
            //已认证的请求会被自动授权
            .authenticated()
    );

1.2 授予权限

DatabaseUserDetailsManager中的loadUserByUsername()方法:

java
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(()->"USER_LIST");
authorities.add(()->"USER_ADD");

1.3 请求未授权的接口

配置WebSecurityConfig:

java
//错误处理
http.exceptionHandling(exception  -> {
    exception.authenticationEntryPoint(new MyAuthenticationEntryPoint());//请求未认证的接口
    exception.accessDeniedHandler((request, response, e)->{ //请求未授权的接口

        //创建结果对象
        HashMap result = new HashMap();
        result.put("code", -1);
        result.put("message", "没有权限");

        //转换成json字符串
        String json = JSON.toJSONString(result);

        //返回响应
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().println(json);
    });
});

2. 用户-角色-资源结构

**需求:**角色为ADMIN的用户才可以访问/user/**路径下的资源。

2.1 配置角色

在WebSecurityConfig中配置角色:

java
//开启授权保护
http.authorizeRequests(
        authorize -> authorize
                //具有管理员角色的用户可以访问/user/**
                .requestMatchers("/user/**").hasRole("ADMIN")
                //对所有请求开启授权保护
                .anyRequest()
                //已认证的请求会被自动授权
                .authenticated()
);

2.2 授予角色

DatabaseUserDetailsManager中的loadUserByUsername()方法:

java
return User
        .withUsername(user.getUsername())
        .password(user.getPassword())
        .roles("ADMIN")
        .build();

3. 用户-角色-权限-资源

RBAC(Role-Based Access Control,基于角色的访问控制)是一种常用的数据库设计方案,它将用户的权限分配和管理与角色相关联。以下是一个基本的RBAC数据库设计方案的示例:

  1. 用户表(User table):包含用户的基本信息,例如用户名、密码和其他身份验证信息。
  2. 角色表(Role table):存储所有可能的角色及其描述。
  3. 权限表(Permission table):定义系统中所有可能的权限。
  4. 用户角色关联表(User-Role table):将用户与角色关联起来。
  5. 角色权限关联表(Role-Permission table):将角色与权限关联起来。

在这个设计方案中,用户可以被分配一个或多个角色,而每个角色又可以具有一个或多个权限。通过对用户角色关联和角色权限关联表进行操作,可以实现灵活的权限管理和访问控制。
当用户尝试访问系统资源时,系统可以根据用户的角色和权限决定是否允许访问。这样的设计方案使得权限管理更加简单和可维护,因为只需调整角色和权限的分配即可,而不需要针对每个用户进行单独的设置。