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。反之亦然。

表建立完成,下面我们进行基础数据实现。

 

posted on 2015-04-28 13:59  包子吃三斤  阅读(1066)  评论(0编辑  收藏  举报