Shiro介绍(三):授权及验证的简单之美

继续上回,昨天我们发现,一旦我们完成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,可以根据需要选择使用。

猜你喜欢

转载自blog.csdn.net/sharetop/article/details/50195609
今日推荐