11.4.6 ?使用Acegi的标签库
称之为标签库可能有点言过其辞了。实际上,Acegi只提供了一个JSP标签:<authz:authorize>标签。
虽然Acegi的安全强制过滤器能够阻止用户浏览他们没有权限看到的页面,但最好的做法是从一开始就不提供指向受限制页面的链接。<authz:authorize>标签能够根据当前用户是否拥有恰当权限来决定显示或隐藏Web页面的内容。
<authz:authorize>是一个流程控制标签,能够在满足特定安全需求的条件下显示它的内容体。它有三个互斥的参数:
n?? ifAllGranted――是一个由逗号分隔的权限列表,用户必须拥有所有列出的权限才能渲染标签体;
n?? ifAnyGranted――是一个由逗号分隔的权限列表,用户必须至少拥有其中的一个才能渲染标签体;
n?? ifNotGranted――是一个由逗号分隔的权限列表,用户必须不拥有其中的任何一个才能渲染标签体。
你可以轻松地想像在JSP中如何使用<authz:authorize>标签根据用户的权限来限制他们的行为。例如,Spring培训应用有一个向用户显示课程有关信息的课程明细页面。对管理员来说,如果能够从课程明细页面直接跳转到课程编辑页面从而可以更新课程信息是很方便的。但你不希望这个链接对除了管理员之外的其他用户可见。
使用<authz:authorize>标签,在用户没有管理员权限的情况下,你可以避免渲染到课程编辑页面的链接:
?
? <authz:authorize ifAllGranted="ROLE_ADMINISTRATOR">
??? <a href="admin/editCourse.htm?courseId=${course.id}">
????? Edit Course
??? </a>
? </authz:authorize>
?
这里,我们使用了ifAllGranted参数,由于这里只需要检查一个授权,所以ifAllGranted标签也是可以使用的。Web应用的安全性只是Acegi功能的一个方面。现在让我们考察它的另一面――保护方法调用。