关于java:RBAC权限管理

8次阅读

共计 3892 个字符,预计需要花费 10 分钟才能阅读完成。

如何用 java 实现一个端午节主题的 RBAC 权限管理系统

RBAC(Role-Based Access Control)是一种罕用的权限治理模型,它基于用户角色来控制系统中的资源拜访。在理论利用中,咱们通常会应用 Spring Security 框架来实现 RBAC 权限管理系统。
RBAC 的概念和原理

RBAC(Role-Based Access Control)是一种基于角色的访问控制模型,它将用户、角色和权限三者离开治理,从而简化了权限调配和治理的过程。RBAC 的核心思想是,不是间接给用户调配权限,而是给用户调配角色,而后给角色调配权限,这样就能够实现多对多的关系,即一个用户能够领有多个角色,一个角色能够领有多个权限。

RBAC 的根本组成部分有:

 用户(User):指零碎中的实体,能够是人员、设施、程序等,须要拜访零碎中的资源。角色(Role):指零碎中的一组权限的汇合,代表了肯定的职责或性能。一个用户能够领有一个或多个角色,一个角色能够被调配给一个或多个用户。权限(Permission):指对系统中的资源执行某种操作的能力。一个角色能够领有一个或多个权限,一个权限能够被调配给一个或多个角色。

RBAC 的根本流程如下:

 管理员依据组织构造和业务需要,定义零碎中的角色和权限,并将它们关联起来。管理员依据用户的身份和职责,将用户调配到相应的角色。用户登录零碎后,依据其所属的角色,取得相应的权限。用户依据其领有的权限,拜访零碎中的资源。

RBAC 的优缺点

RBAC 作为一种罕用的权限治理模型,有以下几个长处:

 简化了权限治理:通过将用户、角色和权限离开治理,升高了权限调配和治理的复杂度和老本。管理员只须要保护用户和角色、角色和权限之间的关系,而不须要为每个用户独自调配权限。进步了安全性:通过实现最小特权准则,即只给用户调配其执行职责所需的最小权限,缩小了数据泄露或滥用的危险。同时,通过实现责任拆散准则,即防止将互相抵触或矛盾的权限调配给同一个用户或同一个角色,加强了零碎的安全性。反对了灵活性:通过反对角色继承和层次结构,能够实现不同级别和类型的角色之间的关系,从而满足不同场景和需要下的权限管制。同时,通过反对动静拆散准则,能够依据上下文或会话状态来动静调整用户激活的权限。

RBAC 也有以下几个毛病:

 须要理解组织构造:为了无效地定义和保护角色和权限,须要分明地理解组织构造和业务需要,并跨部门协调。这在大型或成长中的组织中可能是一项挑战。须要三思而行地施行:为了防止角色爆炸或特权蔓延等问题,须要在施行 RBAC 时思考到各种因素和状况,并制订正当和统一的策略。这可能须要破费大量的工夫和精力。不足细粒度的管制:RBAC 基于角色来管制权限,而不是基于用户的属性或环境的条件。这可能导致 RBAC 过于死板或不够灵便,无奈满足一些非凡或简单的访问控制需要。

表设计

在实现 RBAC 权限管理系统之前,咱们须要先设计相干的表构造。上面是一个简略的表设计:

user 表:存储用户信息,包含用户名、明码等
id username password
1 alice 123456
2 bob 654321
3 charlie 111111

role 表:存储角色信息,包含角色名称、角色形容等
id name description
1 ADMIN 管理员
2 USER 用户
3 GUEST 访客

permission 表:存储权限信息,包含权限名称、权限形容等
id name description
1 /admin/** 拜访管理员页面
2 /user/** 拜访用户页面
3 /guest/** 拜访访客页面

user_role 表:存储用户角色关系,包含用户 ID 和角色 ID
user_id role_id
1 1
2 2
3 3

role_permission 表:存储角色权限关系,包含角色 ID 和权限 ID
role_id permission_id
1 1
1 2
1 3
2 2
2 3
配置 Spring Security

在 Spring Security 中实现 RBAC 权限管理系统的关键在于配置平安拦截器链,即定义哪些 URL 须要哪些权限能力拜访。上面是一个简略的配置示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            // /admin/** 门路下的申请须要 ADMIN 角色能力拜访
            .antMatchers("/admin/**").hasRole("ADMIN")
            // /user/** 门路下的申请须要 USER 角色能力拜访
            .antMatchers("/user/**").hasRole("USER")
            // 其余申请须要认证后能力拜访
            .anyRequest().authenticated()
            .and()
        .formLogin()
            // 登录页面的门路为 /login
            .loginPage("/login")
            // 容许所有用户拜访登录页面
            .permitAll()
            .and()
        .logout()
            // 容许所有用户拜访登出页面
            .permitAll();}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        // 应用自定义的 UserDetailsService 来获取用户信息
        .userDetailsService(userDetailsService)
        // 应用 BCryptPasswordEncoder 加密器来加密明码
        .passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
}

}

实现 UserDetailsService

在下面的配置中,咱们应用了自定义的 UserDetailsService 来获取用户信息。上面是一个简略的示例:

@Service
public class CustomUserDetailsService implements UserDetailsService {

@Autowired
private UserRepository userRepository;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    // 通过 UserRepository 获取用户信息
    User user = userRepository.findByUsername(username);
    if (user == null) {throw new UsernameNotFoundException("User not found");
    }
    // 创立一个空的 GrantedAuthority 汇合,用于存储用户领有的权限
    Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
    // 遍历用户的角色和权限信息,将其转换为 GrantedAuthority 对象,并增加到汇合中
    for (Role role : user.getRoles()) {for (Permission permission : role.getPermissions()) {grantedAuthorities.add(new SimpleGrantedAuthority(permission.getName()));
        }
    }
    // 返回一个 Spring Security 提供的 UserDetails 实现类,蕴含用户名、明码和权限信息
    return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities);
}

}

实现 RBAC 权限管制

除了下面的配置和实现之外,咱们还须要在业务代码中实现 RBAC 权限管制。上面是一个简略的示例:

@Controller
public class UserController {

// 应用 @PreAuthorize 注解来限度用户拜访某些资源的权限,参数为 SpEL 表达式,示意须要满足的条件
@PreAuthorize("hasRole('USER')")
@GetMapping("/user")
public String user() {return "user";}

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String admin() {return "admin";}

}

为了测试咱们实现的 RBAC 权限管理系统的成果,咱们能够应用不同的用户登录零碎,并尝试拜访不同的资源。上面是一些测试用例:
用户名 明码 角色 能够拜访的资源 不能拜访的资源
alice 123456 ADMIN /admin/** 无
bob 654321 USER /user/ /admin/
charlie 111111 GUEST /guest/** /admin/, /user/

正文完
 0