2

Spring Security Intercept-url構成で、特定のパス(ROLE_USERなど)に特定のロールを定義した場合、そのパスには、ユーザーがその権限を持っている場合にのみアクセスできるようにする必要があります。それは理にかなっていますが、ロールをROLE_ANONYMOUSとして設定した<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS"/>場合、ユーザーが認証されている場合でも、たとえばユーザーがROLE_USER権限を持っている場合でも、アクセスできるようにすべきではありませんか?しかし、それは起こりません。

これがログです

Checking match of request : '/resources/js/test.js'; against '/resources/**'
Secure object: FilterInvocation: URL: /resources/js/test.js; Attributes: [ROLE_ANONYMOUS]
Previously Authenticated:   org.springframework.security.authentication.UsernamePasswordAuthenticationToken***********************************************
Voter: org.springframework.security.access.vote.RoleVoter@1712310, returned: -1

次に、アクセス拒否の例外が発生します<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS,ROLE_USER"/>。Http構成を追加すると、正常に機能することがわかります。しかし、上記の場合、それはそのようなことを意味するのでしょうか、それとも私が何か間違ったことをしているのでしょうか。

4

2 に答える 2

2

それは書く正しい方法です:

<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS,ROLE_USER"/>

匿名認証に関する公式リファレンスマニュアルの章を確認できます。ここには、次の構成が表示されます。

<bean id="filterSecurityInterceptor"
    class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
  <property name="securityMetadata">
    <security:filter-security-metadata-source>
      <security:intercept-url pattern='/index.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/hello.htm' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/logoff.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/login.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/>
      <security:intercept-url pattern='/**' access='ROLE_USER'/>
    </security:filter-security-metadata-source>" +
  </property>
</bean>

ROLE_ANONYMOUSとROLE_USERの理解は少し間違っています。これらについて詳しくは、SpringSecurityの開発者の1人であるLukeTaylorによるこの回答を参照してください。

于 2012-08-20T11:55:02.790 に答える
2

私が正しく覚えている場合:いいえ、access = "ROLE_ANONYMOUS"のみで保護されているリソースは、認証されたユーザーがアクセスできないようにする必要があります。「ROLE_USER」を持つユーザーがアクセスできるように、Springに明示的に指示する必要があります。使用しているバージョンによっては、式ベースのアクセス制御の使用を検討する必要があります。このようにして、:access = "permitAll()"を使用するだけで、誰もがリソースにアクセスできるようになります。これは、IMHOの方が簡単です。

于 2012-08-20T12:07:31.100 に答える