Java for Web学习笔记(一四一)Spring security准备(2)授权

访问的范围和权限属于授权。

Principals和Identities

就Java而言,很方便利用java.security.Principal。Principal至少会包含已被认证的用户identity,例如用户名,还可能有其他信息。此外还可以保护用户的授权信息,这些信息的表述应采用常量,例如枚举或者有限的字符串,否者过多的授权会对内存有影响,进而影响性能。

Roles,Groups,Activities和Permissions

授权的表述没有什么约束,但需要仔细设计,修改会比较麻烦。

角色是否具备权限。例如论坛的:

  • 发贴人:可以发布消息和回复
  • 审核员:具有发帖人的角色;外加可以删除消息和回复
  • 管理员:具有审核员的角色;外加可以删除和禁言用户;管理审核员。
public void deleteReply(long id){
    if(security.userInRole("moderator")){
        ...
    }
}

如果需要对发表消息和回贴有不同的审核员,按上述的处理,就需要重新发布我们的应用。可以根据最小的颗粒度来进行授权。这就是基于活动。上面的例子中用户的活动包括:发帖,回帖,修改自己的帖子,修改自己的回复,删除自己的帖子,删除自己的回复,删除其他人的帖子,删除其他人的回复,临时禁言用户,永久禁言用户,删除用户,设置用户权限。

在基于活动中,代码就变为

public void deleteReply(long id){
    if((security.userHasActivity("DELETE_OTHER_REPLY") ||
          isOwnReply() && security.userHasActivity("DELETE_OWN_REPLY")){
        ...
    }
}

当动作有上百的时候,我们为每个用户来定义每个动作的权限就存在困难。引入group的概念。用户继承了group的权限,如果用户修改其权限,可以从一个group移动另一个group。和role不同,group可以在runtime中动态创建或者改变(对应的动作权限的设定),而无需修改程序。

具体的实现方式很多,可以定义一个抽象的principal,里面有各动作的权限,group和用户principal继承之,又或者可以作为一个属性等等。

基于声明的授权

微软的Active Directory为例,当你使用向某台机器使用windows域凭证进行认证时,域控制器想改机器给出你的身份声明以及授权声明。你将继承你所归属的域组的权限。这是结合了基于声明的认证和授权。如果仅使用其中的认证部分,我们需要根据认证返回的标记,在自己的系统中找到权限分配。

相关链接:我的Professional Java for Web Applications相关文章

你可能感兴趣的:(JAVA,读书笔记,愷风(Wei)之Java,for,Web学习笔记)