Spring Security 有自己的标签库,它为访问安全信息和在 JSP 中应用安全约束提供基本支持。 要使用任何标记,必须在 JSP 中声明安全标签库: <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
这个标签被用来确定它的内容是否应该被评估。在 Spring Security 3.0 中,它可以以两种方式使用 [21]。第一种方法使用在标签的 <sec:authorize access="hasRole('supervisor')"> This content will only be visible to users who have the "supervisor" authority in their list of <tt>GrantedAuthority</tt>s. </sec:authorize> 当用于与 Spring Security 的 PermissionEvaluator 进行组合时,该标记还可以用于检查权限。例如: <sec:authorize access="hasPermission(#domain,'read') or hasPermission(#domain,'write')"> This content will only be visible to users who have read or write permission to the Object found as a request attribute named "domain". </sec:authorize> 一个常见的要求是只显示一个特定的链接,如果用户被允许点击它。我们怎样才能事先确定某事是否被允许?这个标签也可以在另一种模式下操作,它允许你将一个特定的 URL 定义为属性。如果允许用户调用该 URL,则将评估标记体,否则将跳过该标记体。所以你可能会有点像 <sec:authorize url="/admin"> This content will only be visible to users who are authorized to send requests to the "/admin" URL. </sec:authorize>
要使用这个标签,在应用程序上下文中也必须有
通过将
在页面中隐藏未授权用户的链接并不能阻止他们访问 URL。例如,他们可以直接键入浏览器。作为测试过程的一部分,你可能希望揭示隐藏区域,以便检查链接在后端是否真正安全。如果将系统属性
如果希望更改默认
此标签允许访问存储在安全上下文中的当前
当然,对于这类事情,没有必要使用 JSP 标签,有些人喜欢在视图中保持尽可能少的逻辑。你可以访问 MVC 控制器中的 此标签仅在与 Spring Security 的 ACL 模块一起使用时才有效。它检查指定域对象所需权限的逗号分隔列表。如果当前用户拥有所有这些权限,则将对标签主体进行评估。如果他们没有,它将被跳过。一个例子可能是
<sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}"> This will be shown if the user has all of the permissions represented by the values "1" or "2" on the given object. </sec:accesscontrollist>
这些权限被传递给在应用程序上下文中定义的
此标记还支持 如果启用了 CSRF 保护,则此标签插入一个隐藏表单字段,该字段具有 CSRF 保护令牌的正确名称和值。如果没有启用 CSRF 保护,此标签将不输出任何内容。
通常,Spring Security 会自动为你使用的任何
你应该把这个标签放在一个HTML <form method="post" action="/do/something"> <sec:csrfInput /> Name:<br /> <input type="text" name="name" /> ... </form> 如果启用了 CSRF 保护,则此标签插入包含 CSRF 保护令牌表单字段和头名以及 CSRF 保护令牌值的元标签。这些元标签对于在应用程序中使用 JavaScript 中的 CSRF 保护非常有用。
你应该将 <!DOCTYPE html> <html> <head> <title>CSRF Protected JavaScript Page</title> <meta name="description" content="This is the description for this page" /> <sec:csrfMetaTags /> <script type="text/javascript" language="javascript"> var csrfParameter = $("meta[name='_csrf_parameter']").attr("content"); var csrfHeader = $("meta[name='_csrf_header']").attr("content"); var csrfToken = $("meta[name='_csrf']").attr("content"); // using XMLHttpRequest directly to send an x-www-form-urlencoded request var ajax = new XMLHttpRequest(); ajax.open("POST", "http://www.example.org/do/something", true); ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded data"); ajax.send(csrfParameter + "=" + csrfToken + "&name=John&..."); // using XMLHttpRequest directly to send a non-x-www-form-urlencoded request var ajax = new XMLHttpRequest(); ajax.open("POST", "http://www.example.org/do/something", true); ajax.setRequestHeader(csrfHeader, csrfToken); ajax.send("..."); // using JQuery to send an x-www-form-urlencoded request var data = {}; data[csrfParameter] = csrfToken; data["name"] = "John"; ... $.ajax({ url: "http://www.example.org/do/something", type: "POST", data: data, ... }); // using JQuery to send a non-x-www-form-urlencoded request var headers = {}; headers[csrfHeader] = csrfToken; $.ajax({ url: "http://www.example.org/do/something", type: "POST", headers: headers, ... }); <script> </head> <body> ... </body> </html>
如果没有启用 CSRF 保护, |