2

以前から Spring Security 2.x を使用していましたが、最近 3.x に切り替えました。私は常に、UserDetailsDB に対する独自のインターフェースと認証の実装を使用しています。

すべて正常に動作します (ログイン、ログアウト、URL フィルター、許可されたユーザーのユーザー名の表示など)。

あとは、ユーザーが認証されていない場合に「ログインしてください」というメッセージを表示するだけでした。私はいくつかのアプローチを試しました:

<sec:authorize access="not isAnonymous()">
or
<sec:authorize access="hasRole('ROLE_ANONYMOUS')">
etc.

それらのどれも機能しませんでした。最後に<sec:authentication property="principal.authorities" />、ホームページの出力に追加して、ユーザーが実際に持っている役割をデバッグしました。これは私が見るものです:

  • ログインしたユーザー -[ROLE_USER, ROLE_ADMIN]
  • 承認されていないユーザー - `` <- 空の文字列

ROLE_ANONYMOUS私の記憶が正しければ、Spring によって常に追加されていたデフォルトの権限を何らかの形で失ったようです。それは最近落とされたものですか?おそらく、この匿名アクセスを別の方法で処理する必要がありますか?

セキュリティ コンテキストの関連部分:

<beans:beans
        xmlns="http://www.springframework.org/schema/security"
        xmlns:beans="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <!-- UNPROTECTED RESOURCES -->
    <http pattern="/" security="none"/>
    <http pattern="/favicon.ico" security="none"/>
    <http pattern="/home" security="none"/>
    <http pattern="/login*" security="none"/>
    <http pattern="/resources/**" security="none"/>

    <!-- PROTECTED RESOURCES -->
    <http auto-config='true' use-expressions="true">
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/admin/**" access="hasRole('ROLE_USER,ROLE_ADMIN')"/>
        <form-login login-page="/login" default-target-url="/dashboard" authentication-failure-url="/login?login_error=true"/>
        <logout logout-url="/logout"/>
    </http>

    <beans:bean id="userAccountsAuthenticationProvider" class="pl.xxx.utils.UserAccountsAuthenticationProvider" />

    <beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
        <beans:property name="userPropertyToUse" value="salt" />
    </beans:bean>

    <authentication-manager>
        <authentication-provider user-service-ref="userAccountsAuthenticationProvider">
            <password-encoder ref="standardPasswordEncoder"/>
        </authentication-provider>
    </authentication-manager>
</beans:beans>
4

1 に答える 1

3

匿名認証は、いくつかの異なる方法で構成できます。カスタムフィルターとして自分で Beanを使用したり<http auto-config="true">、タグ付けしたり、定義したりしますか? <anonymous>security-context.xml を投稿すると、より簡単になります。

とにかく「ログインしてください」と表示したいので、本当に欲しかったのでしょう。

<sec:authorize access="isAnonymous()">Please login</sec:authorize>

「not」なし(ちなみに、このコンテキストで「not」が式の有効な部分であるかどうかはわかりません)。

別の方法は、isAuthenticated()代わりに使用し、EL でそれを否定して、それがあなたのケースで機能するかどうかを確認することです:

<sec:authorize access="isAuthenticated()" var="isAuthenticated" />
<c:if test="${not isAuthenticated}">
  <!-- do stuff -->
</c:if>

編集:

選択したパターンを変更security="none"してaccess="IS_AUTHENTICATED_ANONYMOUSLY"、intercept-url に移動します。Spring Security のフィルター チェーンを有効AnonymousAuthenticationFilterにし、要求に応じて適用する必要があります。

<!-- UNPROTECTED RESOURCES -->
<http pattern="/favicon.ico" security="none"/>
<http pattern="/resources/**" security="none"/>

<!-- PROTECTED RESOURCES -->
<http auto-config='true' use-expressions="true">
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/home" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_USER,ROLE_ADMIN')"/>
    <form-login login-page="/login" default-target-url="/dashboard" authentication-failure-url="/login?login_error=true"/>
    <logout logout-url="/logout"/>
</http>

、およびで使用isAnonymous()したいとします。//home/login*

私の以前の解決策はうまくいきました。security="none"チェックするとisAuthenticated() 常にfalseが得られたため、それを否定することは、ログに記録されていないことをチェックするようなものでした。

于 2012-09-10T20:52:34.817 に答える