shiro基于角色的授权

jopen 10年前

1.角色检查

如果你要基于简单/传统的隐含角色名进行访问掏,你可以执行角色检查:

如果你想简单地检查一下当前Subject是否拥有一个角色,你可以在一个实例上调用hasRole*方法的变形。

例如,查看一个Subject是否有特定(单独)的角色,你可以调用subject.hasRole(roleName)方法,做出相应的反馈。

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.hasRole("administrator")) {

//show the admin button

} else {

//don't show the button?  Grey it out?

}

下面是你可以根据需要调用的函数:

hasRole(String roleName)

如果Subject指定了特定的角色返回真,否则返回假;

hasRoles(List roleNames)

返回一个与参数顺序相对应的hasRole结果数组,当一次有多个角色需要检测时非常有用(如定制一个复杂的视图)。

hasAllRoles(Collection roleNames)

如果Subject指定了所有角色返回真,否则返回假。

2.角色判断

还有另一个方法检测Subjet是否是指定为某个角色,你可以在的代码执行之前简单判断他们是否是所要求的角色,如果Subject不是所要求的角色, AuthorizationException异常将被抛出,如果是所要求的角色,判断将安静地执行并按期望顺序执行下面的逻辑。

例如:

Subject currentUser = SecurityUtils.getSubject();

//guarantee that the current user is a bank teller and

//therefore allowed to open the account:

currentUser.checkRole("bankTeller");

openBankAccount();

与hasRole*方法相比,这种方法的好处在于代码更为清晰,如果当前Subject不满足所需条件你不需要建立你自己的AuthorizationExceptions

与isPermitted* 方法相比较,这种方法的优势是代码更为清晰,如果当前Subject不符合条件,你不必创建你自己的AuthorizationExceptions异常(如果你不想那么做)。。

下面是你可以根据需要调用的函数:

checkRole(String roleName)

如果Subject被指定为特定角色则安静地返回否则抛出AuthorizationException异常;

checkRoles(Collection roleNames)

如果Subject被指定了所胡特定的角色则安静地返回否则抛出AuthorizationException异常;

checkRoles(String... roleNames)

和上面的checkRoles具有相同的效果,但允许Java5的变参形式。