7

データベースからユーザーの情報を取得しようとする403 forbiddenたびにエラーが発生します。以下のコードに関連して、 Ajax TestGETボタンを押してリクエストを試みるたびに、実行に失敗してアラートが表示されますが、コンソールにもエラーが表示されます。それがSpringのセキュリティと関係があるかどうかはわかりませんか?403 Forbidden

ユーザー JSP ページ:

<table>
    <tr>
        <td>User Id</td>
        <td>Full Name</td>
        <td>Username</td>
        <td>Email</td>
        <td>Date of Birth</td>
        <td>User Authority</td>
        <td>Update </td>
        <td>Delete</td>
    </tr>
    <c:forEach var="user" items="${users}">
        <tr>
            <td><c:out value="${user.id}" /></td>
            <td><c:out value="${user.name}"/></td>
            <td><c:out value="${user.username}"/></td>
            <td><c:out value="${user.email}"/></td>
            <td><c:out value="${user.dob}"/></td>
            <td><c:out value="${user.authority}"/></td>
            <td>
                <a id="update" href="<c:url value="/viewUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Update</button></a>
            </td>
            <td>
                <a id="delete" href="<c:url value="/deleteUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Delete</button></a>
            </td>
            <td>
                <button class="loadUser" name="id" value="${user.id}">Ajax test</button>
            </td>
        </tr>
    </c:forEach>
</table>
 <div id="personIdResponse"> </div>
<script type="text/javascript">
    $(document).ready(function(){
        $(".loadUser").click(function(e) {
            e.preventDefault();
            var personId = +$(this).val();
            $.get('${pageContext.request.contextPath}/SDP/ajaxTest/' + personId, function(user) {
                  $('#personIdResponse').text(user.name + ', = username ' + user.username);
                })
            .fail(function(user){
                alert('Could not load user');
            });
        });
    });
</script>

ユーザーコントローラークラス:

    @RequestMapping("/viewUser")
public String updateUser(Model model, @RequestParam(value = "id", required = false) Integer id) {

    User user = usersService.getUser(id);

    model.addAttribute("user", user);

    return "settings";
}

@RequestMapping("/ajaxTest")
@ResponseBody
public User ajaxTest(@RequestParam(value = "id", required = false) Integer id) {

    User user = usersService.getUser(id); 
    return user;
}
4

5 に答える 5

27

これは通常、Spring のデフォルトの CSRF 保護が原因です。

たとえば、JS コードから DELETE HTTP リクエストを使用する場合、CSRF 保護ヘッダーも送信する必要があります。

CSRF 保護を無効にする必要はありません。必要がない場合は、それを行わないでください。

次の方法で、CSRF AJAX/REST 保護を簡単に追加できます。

1.すべてのページにメタヘッダーを追加する (@layout.html などを使用):

<head>
  <meta name="_csrf" th:content="${_csrf.token}"/>
  <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
</head>

2.すべてのリクエストに対してこれらのヘッダーを送信するように ajax リクエストをカスタマイズします。

$(function () {
  var token = $("meta[name='_csrf']").attr("content");
  var header = $("meta[name='_csrf_header']").attr("content");
  $(document).ajaxSend(function(e, xhr, options) {
    xhr.setRequestHeader(header, token);
  });
});

私は thymeleaf を使用しているため、コンテンツ属性の代わりに th:content を使用していることに注意してください。

于 2015-11-19T17:46:21.687 に答える
5

Spring Security 3.2R1 以降を使用している場合は、このソリューションを使用してみて ください http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection

于 2013-12-03T09:59:58.073 に答える
2

Spring Security 4.0 の時点で、CSRF 保護は XML 構成でデフォルトで有効になっています。CSRF 保護を無効にする場合は、対応する XML 構成を以下に示します。

<security:http use-expressions="true">
           ...
   <security:csrf disabled="true" />
</security:http>
于 2015-12-16T18:12:11.280 に答える
1

ファイルのパーミッションを確認してください。403 は Ajax ではなくサーバー エラーです。要求されたファイル (ファイル、つまり URL) を直接確認してみてください。

于 2013-09-30T09:55:31.233 に答える