web-dev-qa-db-ja.com

JSP EL式でSpring Security Principalを取得する

Spring MVCとSpring Securityバージョン3.0.6.RELEASEを使用しています。 JSPでユーザー名を取得する最も簡単な方法は何ですか?または、ユーザーがログインしているかどうかだけですか?いくつかの方法が考えられます。

1.スクリプトレットを使用する

このようなスクリプトレットを使用して、ユーザーがログインしているかどうかを判断します。

<%=org.springframework.security.core.context.SecurityContextHolder.getContext()
    .getAuthentication().getPrincipal().equals("anonymousUser")
    ? "false":"true"%>

私はスクリプトレットを使用するのが好きではありませんが、これをいくつかの<c:if>タグで使用したいので、ページ属性として戻す必要があります。

2. SecurityContextHolderの使用

@Controllerから再びSecurityContextHolderを使用して、モデルに配置できます。ただし、すべてのページでこれが必要なので、コントローラーのすべてにこのロジックを追加する必要はありません。

これを行うよりクリーンな方法があると思う...

42
Jeremiah Orr

Springセキュリティタグを確認してください:<sec:authentication property="principal.username" />

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

そして、ログに記録されているかどうかを確認できます:

<sec:authorize access="isAuthenticated()"> 

c:ifの代わりに

55
alephx

スレッドには他の回答があることは知っていますが、ユーザーが認証されているかどうかを確認する方法については誰も回答していません。だから私は自分のコードの見た目を共有しています。

プロジェクトにタグlibを含めます。

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

次に、以下を追加して、現在のスコープにユーザーオブジェクトを作成します。

<sec:authentication var="user" property="principal" />

その後、追加することで簡単にユーザー名を表示できます。プロジェクトで別のクラスに変更する方法でスプリングセキュリティを実装していない限り、「プリンシパル」オブジェクトは一般に文字列型であることに注意してください。

<sec:authorize access="hasRole('ROLE_USER') and isAuthenticated()">
${user}
</sec:authorize>

これがユーザーの役割を確認しようとしている人の助けになることを願っています。

Mavenを使用している場合は、このスレッドでChristian Vielmaが述べているように、依存関係タグを追加します。

ありがとう!

17
Sameer Gupta

次のように使用できます:Spring Security Tag Lib-3.1.3.RELEASE

<sec:authentication var="principal" property="principal" />

その後:

${principal.username}
11

私はMavenを使用していたため、taglibsライブラリを追加してpom.xmlに追加する必要がありました。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.1.3.RELEASE</version>
</dependency>

その後、私のJSPに追加しました:

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

そして:

<sec:authentication property="principal" />

principal.usernameはエラーを出し続けました(たぶんUsernamePasswordAuthenticationTokenオブジェクトを作成した方法かもしれません)。

9

これは、ユーザーがログインしているかどうかにかかわらず機能し、匿名認証を使用している場合に機能します。

<sec:authorize access="isAuthenticated()">
    <sec:authentication property="principal.username" var="username" />
</sec:authorize>
<sec:authorize access="!isAuthenticated()">
    <sec:authentication property="principal" var="username" />
</sec:authorize>

後...

Hello ${username}
5
Neil McGuigan

Authentication.getPrincipal() によって返される型はObjectであるため、<sec:authentication property="principal.username" />は常に機能するとは限りません。つまり、 serDetail (上記のwork)、文字列またはその他の何か。

JSPページにユーザー名を表示するために、${pageContext.request.userPrincipal.name}を使用する方が信頼できると思います。

これは、ストリングを返す Java.security.Principal.getName() を使用します。

5
gerrytan

alephxに同意し、彼の答えに投票しました。

しかし、別のアプローチが必要な場合は、Spring Rooが使用するアプローチを使用できます。

SecurityContextHolderAwareRequestFilterがある場合、SecurityContextにアクセスするリクエストラッパーを使用して、標準のサーブレットAPIセキュリティメソッドを提供します。

このフィルターは、<http>タグは、Spring Security名前空間から取得します。 FilterChainProxyのセキュリティフィルターチェーンに登録することもできます(applicationContext-security.xmlで宣言されたBeanへの参照を追加するだけです)

その後、RooのようにセキュリティサーブレットAPIにアクセスできます(footer.jspxを検索して、条件付きログアウトリンクの記述方法を確認します)

  <c:if test="${pageContext['request'].userPrincipal != null}">
<c:out value=" | "/>
...
5
jbbarquero

jタグは次のとおりです。

<%@taglib prefix="j" uri="http://Java.Sun.com/jsp/jstl/core" %>

secタグは次のとおりです。

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

Pom.xmlに追加します。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.1.3.RELEASE</version>
</dependency>

ページに追加します。

<sec:authentication var="principal" property="principal"/>
<j:choose>
    <j:when test="${principal eq 'anonymousUser'}">
          NOT AUTHENTICATED
    </j:when>
    <j:otherwise>
          AUTHENTICATED
    </j:otherwise>
</j:choose>
3
Fatih Başar

私が知る限り、デフォルトで Spring Security 3.0.xのインストール a SecurityContextHolderRquestAwareFilter です。したがって、HttpServletRequest.getUserPrincipal()、およびHttpServletRequest.isUserInRole()を呼び出してロールをクエリすることもできます。

1
gpeche

1)追加のフィールドmobileを使用したカスタムユーザークラス:

 public class SiteUser extends User {

    public SiteUser(String username, String password, Collection<? extends GrantedAuthority> authorities,
            String mobile) {
        super(username, password, true, true, true, true, authorities);
        this.mobile = mobile;
    }

    private String mobile;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

}

2)私のUserDetailsS​​erviceImpl.JavaでこのカスタムSiteUserオブジェクトを作成しました。

public SiteUser loadUserByUsername(String username)  {
        UserInfoVO userInfoVO = userDAO.getUserInfo(username);
        GrantedAuthority authority = new SimpleGrantedAuthority(userInfoVO.getRole());

        SiteUser siteUser = new SiteUser(userInfoVO.getUsername(), userInfoVO.getPassword(),
                Arrays.asList(authority), userInfoVO.getMobile());

        return siteUser;
}

)およびビューで次のようにアクセスしています:

<a href = "#" th:text = "$ {#httpServletRequest.userPrincipal.principal.mobile}">