RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。下面就是基于该模式的图书销售系统。
首先,Book作为父类,写一个计算价格的方法double cost()。BookBiz类,初始化(static Book[] books和static void makeData())和写具体方法。如:
void inBook(int bookId, int num)、void outBook(int bookId,int num)、void saveBook(Book book)、void query()、Book buyBook(int bookId,int num)、EX buyEx(int exCode)、void checkout(Book book)、Book findBookById(int id)、static EX create(int id)等。
以上只是基本功能上的实现,下面才是关于用户角色权限的重点。
先看User类,只包含一条属性private Role role;一个boolean login(String username, String password){}、void in(int bookId,int num){role.in(bookId, num);}void out(int bookId,int num){role.out(bookId, num);}、void save(Book book){role.save(book);}、void query(){role.query();}、void checkout(Book book){role.checkout(book);}、Book buy(int bookId, int num){return role.buy(bookId, num);}、EX buyEx(int exCode){return role.buyEx(exCode);}等。
再来看Role抽象类,有三个属性:private String description//角色名 ;private StoreMgr storeMgr = null//库管权限;private Normal normal。方法比如void in(int bookId,int num){
if(storeMgr == null){
System.out.println("您没有库存管理员权限");
return;
}
storeMgr.in(bookId,num);
}
共有的方法: void query(){
if(normal == null&&storeMgr==null){
System.out.println("您还没有登录,请登陆后再操作");
return;
}else if(normal!=null){
normal.query();
}else{
storeMgr.query();
}
}
再来看Role里面的两个属性:权限Normal和StoreMgr被定义成两个接口,并由DefaultCustomer和DefaultStoreMgr来具体实现。比如StoreMgr里定义了方法有void in(int bookId,int num); void out(int bookId,int num);public void save(Book book);public void query();Normal里的方法为public void query();public Book buy(int bookId,int num);public EX buyEx(int exCode);public void chekout(Book book);具体实现方法如public void chekout(Book book) {
BookBiz bookBiz=new BookBiz();
bookBiz.checkout(book);}可以看出都是调用BookBiz里面已经写好的方法。
顺带提一下:Role里有两个子类,如class Customer extends Role {
public Customer(){
this.setDescription("普通顾客");
}
}
好了,梳理一下:User中只有一个属性Role,User可以做所有的事情,但都是指挥Role去做。Role是个有两个子类(角色)的抽象类,属性为角色名和两个权限(接口),这里面就是具体的两个权限(接口)做事情。当然这两个接口做事情也是靠实现它们的子类来具体实现的,而这两个实现接口的子类每次做事情需要加载BookBiz(该类只做数据库的操作,不关心具体命令),即模拟实现数据库的连接和其他各种操作。其他就是在测试类中根据用户输入来动态创建角色、创建权限、分配权限和授权角色,然后根据角色类型执行不同的具体操作。