RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。
理解为用户拥有多个角色,角色拥有多个权限。构成了“用 户-角色-权限”的授权模型。并且他们之间的关系为多对多。
对于用户来说,登陆不同的账号密码,所属的角色不同,可拥有不同的操作。
(写任何代码之前先要构思我们要做什么,做这件事情,需要哪些最基础的东西,他们之间的关系是什么,如何把他们整合在一起。
如果没有想好,代码写下去会造成反复的修改浪费了时间。)
1.首先我们需要3张表 用户表 角色表 action表,用户表角色表为多对多关系,角色表与action表为多对多关系。所以需要2张关系表,
即user_role 和role_action,用的知识为hibernate多对多表关联,下面贴下代码。
首先是T_user类
private String id; private String name; private String age; private String sex; private Set<T_role> role =new HashSet<>(); private String t_name; private String t_password; @ManyToMany(fetch=FetchType.EAGER) @JoinTable( name="user_role", joinColumns=@JoinColumn(name="user_id",referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="role_id",referencedColumnName="id") ) public Set<T_role> getRole() { return role; } public void setRole(Set<T_role> role) { this.role = role; } //其他的set get省略
T_role类
private String id; private String name; private Set<T_user> user =new HashSet<>(); private Set<Menu> menu =new HashSet<>(); public T_role() { } @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="user_role", joinColumns=@JoinColumn(name="role_id",referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="user_id",referencedColumnName="id")) public Set<T_user> getUser() { return user; } public void setUser(Set<T_user> user) { this.user = user; } @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="role_menu", joinColumns=@JoinColumn(name="role_id",referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="menu_id",referencedColumnName="id")) public Set<Menu> getMenu() { return menu; } public void setMenu(Set<Menu> menu) { this.menu = menu; }
Menu类(即action类)
private String id; private String name; private String icon; private String url; private String __parentId; private String type; private Set<T_role> role =new HashSet<>(); @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="role_menu", joinColumns=@JoinColumn(name="menu_id",referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="role_id",referencedColumnName="id")) public Set<T_role> getRole() { return role; } public void setRole(Set<T_role> role) { this.role = role; } //其他setget省略
下面是连接表
role_menu
role_menu的外键
简单说明下 menu_id映射了menu表role_id映射了role表
下面是user_role表
user_role的外键
同上不在解释;
只要懂得hibernate的多对多关系,上面的建表会非常简单。
通过以上的5张表,我们可以从用户表获取关联的角色,然后通过角色表获取关联的action。反之亦然。
表建立完成,下面我们进行基础数据实现。