使用JSP Taglibs的Spring View Layer Security

到目前为止,在以前的教程中,我们已经了解了如何在登录表单自定义用户详细信息服务甚至方法级安全性后面保护您的应用程序。所有这些安全性实现都在MVC的控制器或模型层上。是时候在视图层中添加安全性了。当我们要根据用户的角色隐藏某些链接或按钮以使他将无法访问该功能时,通常需要用到它。

Taglib声明

为了确保以后查看应用程序的安全,spring Security拥有自己的taglib,它为访问安全信息和在JSP中应用安全约束提供了基本支持。要在jsp文件中使用安全功能,需要添加以下标记库声明:

<%@ taglib uri =“ http://www.springframework.org/security/tags”前缀=“ security”%>

您可以选择自己的前缀,并且需要在jsp文件中使用该前缀。

安全标签

Spring基本上提供了3个标签来保护视图层信息,即

  • 授权标签
  • 验证标签
  • accesscontrollist标签

让我们一一看。

1)授权标签:

该标签用于确定是否应评估其内容。该标签具有两种形式,即基于用户角色的安全信息或基于用户访问特定URL的权限的安全信息。

用法示例如下所示:

<security:authorize ifAnyGranted="ROLE_ADMIN">
    <tr>
        <td colspan="2">
            <input type="submit" value="<spring:message code="label.add"/>"/>
        </td>
    </tr>
</security:authorize>

OR

<security:authorize url="/admin">
    <tr>
        <td colspan="2">
            <input type="submit" value="<spring:message code="label.add"/>"/>
        </td>
    </tr>
</security:authorize>

2)验证标签

此标记允许访问存储在安全上下文中的当前身份验证对象。它直接在JSP中呈现对象的属性。因此,例如,如果Authentication的主体属性是Spring Security的UserDetails对象的实例,则使用<sec:authentication property =“ principal.username”> </ sec:authentication>将呈现当前用户的名称。

此标记不是直接出于安全目的,而是可用于访问可用于视图层安全性的信息。

<security:authentication property =“ principal.username” />

3)accesscontrollist标记

该标签仅在与Spring Security的ACL模块一起使用时才有效。它检查以逗号分隔的指定域对象的所需权限列表。如果当前用户具有这些权限中的任何一个,则将评估标签正文。如果他们不这样做,它将被跳过。

<sec:accesscontrollist hasPermission="1,2" domainObject="someObject">
	This will be shown if the user has either of the permissions
	represented by the values "1" or "2" on the given object.
</sec:accesscontrollist>

来源#http: //static.springsource.org/spring-security/site/docs/3.0.x/reference/taglibs.html

应用示例

我们已经基于Spring Security教程登录表单开发了一个员工管理应用程序。在此应用程序中,经过身份验证的用户可以添加/删除/列出员工。现在,让我们修改应用程序,以便没有“ ROLE_ADMIN”权限的任何用户都看不到“添加”按钮。

以下是我在应用程序中所做的代码更改:

< %@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
< %@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
< %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
< %@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>
<html>
<head>
    <title>Spring 3 hibernate integration example on www.how2codex.com</title>
</head>
<body>

<h2>Employee Management Screen : <security:authentication property="principal.username"></security:authentication></h2>
 <h6><a href="<c:url value='j_spring_security_logout'></a>">Click here to logout</h6>
<form:form method="post" action="add" commandName="employee">

    <table>
    <tr>
        <td><form:label path="firstname"><spring:message code="label.firstname"></spring:message></form:label></td>
        <td><form:input path="firstname"></form:input></td>
    </tr>
    <tr>
        <td><form:label path="lastname"><spring:message code="label.lastname"></spring:message></form:label></td>
        <td><form:input path="lastname"></form:input></td>
    </tr>
    <tr>
        <td><form:label path="email"><spring:message code="label.email"></spring:message></form:label></td>
        <td><form:input path="email"></form:input></td>
    </tr>
    <tr>
        <td><form:label path="telephone"><spring:message code="label.telephone"></spring:message></form:label></td>
        <td><form:input path="telephone"></form:input></td>
    </tr>
    <security:authorize ifAnyGranted="ROLE_ADMIN">
    <tr>
        <td colspan="2">
            <input type="submit" value="<spring:message code="label.add"/>"/>
        </td>
    </tr>
    </security:authorize>
</table>
</form:form>

<h3>Employees</h3>
<c:if test="${!empty employeeList}">
<table class="data">
<tr>
    <th>Name</th>
    <th>Email</th>
    <th>Telephone</th>
    <th></th>
</tr>
<c:foreach items="${employeeList}" var="emp">
    <tr>
        <td>${emp.lastname}, ${emp.firstname} </td>
        <td>${emp.email}</td>
        <td>${emp.telephone}</td>
        <td>delete</td>
    </tr>
</c:foreach>
</table>
</c:if>

</body>
</html>

以下是上述浏览器屏幕更改的结果。

员工管理屏幕
员工管理屏幕

应用安全标签后,“添加”按钮将消失,并在屏幕上显示登录的用户名“ lokesh”。

Spring JSP标签演示
在JSP中应用安全标记后的屏幕

让我知道是否仍然不清楚。

学习愉快!

saigon has written 1440 articles

Leave a Reply