30

私は春が初めてです:

認証されたユーザーがログイン ページにアクセスできないようにします。ユーザーがすでに認証されている場合、「/login」のリダイレクトを処理する適切な方法は何ですか? たとえば、すでにログインしている場合は「/index」にリダイレクトしたいとします。

ログイン時に「isAnonomous()」を試しましたが、アクセス拒否ページにリダイレクトされます。

<security:http auto-config="true" use-expressions="true" ...>
    <form-login login-processing-url="/resources/j_spring_security_check"
                 default-target-url="/index"
                login-page="/login" authentication-failure-url="/login?login_error=t" />
    <logout logout-url="/resources/j_spring_security_logout"  />
   ...
  <security:intercept-url pattern="/login" access="permitAll" />
  <security:intercept-url pattern="/**" access="isAuthenticated()" />
</security:http>
4

4 に答える 4

55

ログインページのコントローラー機能で:

  1. ユーザーがログインしているかどうかを確認します。

  2. その場合、彼をインデックスページに転送/リダイレクトします。

関連コード:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (!(auth instanceof AnonymousAuthenticationToken)) {

    /* The user is logged in :) */
    return new ModelAndView("forward:/index");
}

アップデート

または、この場合path variableのようにマッピングが含まれている可能性がある別のシナリオでは、このロジックも実装できます。@GetMapping(path = "/user/{id}")

@GetMapping(value = "/login")
public String getLogin() throws Exception {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    if (!(auth instanceof AnonymousAuthenticationToken)) {
        User loggedInUser = userService.findByEmail(auth.getName())
                    .orElseThrow(Exception::new);
        /* The user is logged in :) */
        return "redirect:/user/" + loggedInUser.getUserId();
    }
    return "login";
}
于 2012-10-30T04:29:42.040 に答える
8

ユーザーがすでにログインしている場合に、ログイン ページから正常にリダイレクトするには、次を login.jsp に追加します。

jsp の先頭にセキュリティ taglib ヘッダーを追加します。

<%@taglib uri="http://www.springframework.org/security/tags" prefix="sec"%>

次に、次のタグを「head」タグ内 (できれば上部近く) に追加します。

<sec:authorize access="isAuthenticated()">
    <% response.sendRedirect("main"); %>
</sec:authorize>

ログインページにアクセスしているユーザーがすでにログインしている場合、これは main.html (またはメインの .jsp がマップされているもの) にリダイレクトされます。

有効なログインページのプラクティスは、スプリングセキュリティの「フォームログイン」ビーンにすべてのリダイレクト作業を行わせることであるため、コントローラーを介してこれを行うことはうまくいきませんでした。そのため、変更するログインコントローラーはありませんでした。

于 2016-03-01T10:54:12.620 に答える
2

ねえ、あなたはそれを行うことができます。

<h:head>
<sec:authorize access="isAuthenticated()">
    <meta http-equiv="refresh" content="0;url=http://your index.xhtml url (full url)" /> 
</sec:authorize>
</h:head>

この方法はとても簡単で便利ですね。

于 2015-01-31T22:02:18.093 に答える