继续上回,昨天我们发现,一旦我们完成Spring的必要配置之后,Shiro在认证方面的代码量是非常少的。今天我们来看看关于授权(Authorization),Shiro又是如何简化代码的。
Shiro提供了三种授权验证模式。
- 注解,使用方便,控制方法是否能被调用。
- JSP标签,也很方便,可以在页面上根据权限选择显示的内容。
- 编码,略显麻烦,但是灵活度和自由度都是最高的。
我们可以根据需要,灵活选择配置这三种验证模式,比如一般情况下,我们在Controller中配置注解,限制某些方法只能被有权限的用户访问。OK,没问题,另一方面,我们又需要在页面上根据当前登录用户的权限,有选择的显示部分内容,这时候,JSP标签就派上用场了。再进一步,在我们的业务里,有些安全可能会涉及到操作的数据,比如,同样是销售人员登录进来,看到菜单一样,但是我们只允许张三看『北京』的数据,李四看『广东』的数据,这个时候,我们需要使用Shiro提供的权限方法,用编码的方式做最灵活的定制了。
先看注解方式的权限,代码也很简单。
//@RequiresRoles("administrator")
@RequiresPermissions("system:admin")
@RequestMapping(value="/admin",method=RequestMethod.GET,headers = {"Accept=text/html"})
public ModelAndView showAdmin(){
ModelAndView mv = new ModelAndView();
String cnt = RandomUtils.nextLong()+"";
mv.addObject("message", cnt);
mv.setViewName("admin");
return mv;
}
与我们常用的Spring中的注解没有太大差别,所以使用起来也是非常方便的。除了上面示例中『要求指定的角色』以及『要求指定的权限』,还有『requiresUser』要求是登录用户或者通过rememberme进来的用户也算。另外『requiresAuthentication』就是要求你必须是新鲜登录进来的才行。
不过,如果要使用注解,你在Spring的配置文件中需要先加上这个Shiro提供的注解切面,否则注解是不起作用的。
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
再来看看JSP标签,我们一般的JSP中都会使用JSTL的标签(见我们的示例),那么要使用Shiro的JSP标签,类似地加上标签库先:
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
然后,在JSP代码中,输入
<p>
<shiro:hasRole name="administrator">
<h4>管理员才能看到我</h4>
</shiro:hasRole>
<shiro:hasPermission name="system:view">
需要有system:view权限
</shiro:hasPermission>
</p>
最后,我们来看看用代码实现授权管理。
String perm = “printer:print:laserjet4400n”;
if(currentUser.isPermitted(perm)){
//show the print button?
} else {
//don’t show the button?
}
这是官方教程上的例子,类似的方法还有很多,一般分为两类,一类是 isXXXXX,hasXXXXX,返回都是boolean,还有一类是checkXXXXX,不返回是否有权限,而是如果没权限直接抛出异常AuthorizationException,可以根据需要选择使用。