[TOC]
## RBAC权限设计
权限设计有多种方案比如rbac、abac、acl等。
这里使用的是RBAC基于角色的权限访问控制(Role-Based Access Control)
### 图片说明
用户关联角色,角色关联权限。
所以间接的,用户可以多个权限。

### 数据表
| 表名称 | 功能 |
| --- | --- |
| sys_user | 用户表 |
| sys_role | 角色表 |
| sys_permission | 权限表 |
| sys_role_permission | 角色权限对应表 |
| sys_user_role | 角色用户对应表 |
### 主要接口
认证服务器获取用户信息的时候需要调用下面的接口
~~~
@Service("userDetailsService")
@Slf4j
public class SqlUserDetailsServiceImpl implements UserDetailsService {
@Resource
AppUserService userService;
@Override
public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
LoginAppUser loginAppUser = userService.findByUsername(name);
if (loginAppUser == null) {
throw new InternalAuthenticationServiceException("用户名或密码错误");
}
return loginAppUser;
}
}
~~~
而这里loginAppUser,里面就有涉及到权限这一块!
~~~
@Setter
@Getter
public class LoginAppUser extends User implements SocialUserDetails {
@Override
public String getUserId() {
return getId() + "";
}
private Set<String> permissions;
@JsonIgnore
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new HashSet<>();
//更加rbac设置权限
if (!CollectionUtils.isEmpty(getRoles())) {
collection = getRoles().stream()
.map(role -> role.getPermissions())
.flatMap(Collection::stream)
.map(permission -> new SimpleGrantedAuthority(permission.getName()))
.collect(Collectors.toList());
}
return collection;
}
@Override
public String getUsername() {
return getName();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
~~~
## 菜单和权限
> 有一些软件系统把菜单和权限放在一起做了,有菜单转化成有对应的权限。
> 而这里fun-cloud是把菜单和权限独立出来。
> 额外使用角色去关联菜单
### 数据表
| 表 | 功能 |
| --- | --- |
| sys_role | 角色表 |
| sys_role_menu | 角色菜单关联表 |
| sys_menu | 菜单表 |
## 界面截图
如下截图:体现了角色、菜单、权限的关系
