25

私は多くの同様の質問を見つけましたが、どれも私の問題を解決していません。私の問題はROLE_USER、の機能にアクセスできることですROLE_ADMIN

私のspring-security.xmlコードは次のとおりです。

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:s="http://www.springframework.org/schema/security"
   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.0.xsd">   

<s:http auto-config="true" use-expressions="true">
    <s:intercept-url pattern="/index.jsp" access="permitAll" />
    <s:intercept-url pattern="/welcome*" access="hasRole('ROLE_USER')" />
    <s:intercept-url pattern="/helloadmin*" access="hasRole('ROLE_ADMIN')" />

    <s:form-login login-page="/login" default-target-url="/welcome"
        authentication-failure-url="/loginfailed" />
    <s:logout logout-success-url="/logout" />
</s:http>

<s:authentication-manager>
  <s:authentication-provider>
    <s:user-service>
        <s:user name="asif" password="123456" authorities="ROLE_USER,ROLE_ADMIN" />
        <s:user name="raheel" password="123456" authorities="ROLE_USER" />          
    </s:user-service>
  </s:authentication-provider>
</s:authentication-manager>

コードを追加する<s:global-method-security pre-post-annotations="enabled"/> とリソースが見つからないというエラーが表示され、コードを削除すると正常に実行されますが、関数にROLE_USERアクセスできますROLE_ADMIN

私のコントローラー機能はです。

@PreAuthorize("hasRole('ROLE_ADMIN')")
@RequestMapping(value="/delete", method = RequestMethod.GET)
public String DeleteAll(ModelMap model, Principal principal ) {

    org.springframework.security.core.userdetails.User activeUser = (org.springframework.security.core.userdetails.User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    System.out.println("Active user is "+activeUser.getUsername()+"Authorities are "+activeUser.getAuthorities());
    return "deleteUsers";

}
4

9 に答える 9

33

XML構成を使用している場合は、次の属性を追加することを忘れないでください。

<s:global-method-security pre-post-annotations="enabled"/>

Java構成を使用している場合は、次の注釈を追加することを忘れないでください。

@EnableGlobalMethodSecurity(prePostEnabled = true)

于 2016-01-08T09:38:32.423 に答える
28

あなたが持っている必要があります

<s:global-method-security pre-post-annotations="enabled"/>

@PreAuthorize注釈を機能させたい場合。


コメントに答えるには:

spring-aop依存関係が欠落しているようです。

Mavenを使用している場合は、次のものが必要です。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

そうでない場合は、ここからjarファイルを入手できます。

于 2012-08-07T08:39:34.840 に答える
15

私は同じ問題に直面していました。以下の要素をapplicationContext.xmlから*-servlet.xml(ディスパッチャーの構成xml)に移動すると、問題は解決しました。

<security:global-method-security secured-annotations="enabled"/>

この要素は、アプリケーションのxmlではなく、ディスパッチャのxmlに含める必要があります。
春のFAQ

于 2014-05-01T22:44:38.083 に答える
10

アノテーションの操作でも同じ問題が発生しました。問題は、コントローラーに@Controllerアノテーションがないことでした。


だからあなたが必要なようです:

  • SpringSecurity構成のこれらのアノテーション:

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    
  • コントローラのこれらの注釈:

    @Controller
    public class ServiceRS {
    
        @RequestMapping(value = "/admin", method = RequestMethod.GET)
        @PreAuthorize("hasAuthority('ROLE_ADMIN')")
        public void wsAdmin() {
            [...]
        }
    }
    

さらに、まだ問題が発生している場合は、これをlog4j2構成に追加することを検討してください。

    <Logger name="org.springframework.security" level="trace" additivity="false">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingRandomAccessFile" />
    </Logger>

注釈がSpringによって考慮されているかどうかがログに表示されます。

TRACE org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] Looking for Pre/Post annotations for method 'wsAdmin' on target class '***.ServiceRS' 
DEBUG org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] @org.springframework.security.access.prepost.PreAuthorize(value=hasAuthority('ROLE_ADMIN')) found on specific method: public void ***.ServiceRS.wsAdmin() 
DEBUG org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource {} [main] Caching method [CacheKey[***.ServiceRS; public void ***.ServiceRS.wsAdmin()]] with attributes [[authorize: 'hasAuthority('ROLE_ADMIN')', filter: 'null', filterTarget: 'null']] 

そして明らかに、org.springframework.security.access.expression.SecurityExpressionRootの対応するメソッドにブレークポイントを追加して、アノテーションの条件で呼び出しが行われたかどうかを確認することを検討できます。

よろしく。

于 2018-03-20T10:54:17.097 に答える
3

@Securedアノテーションを試してみてください。

その後、あなたは持っているでしょう

@Secured("ROLE_ADMIN")
@RequestMapping(value="/delete", method = RequestMethod.GET)
public String DeleteAll(ModelMap model, Principal principal ) {

  ...

}

これについての詳細なブログ投稿があります。

于 2012-08-07T07:36:15.570 に答える
3

上記の答えはどれも私にはうまくいきませんでした。私はセキュリティデコレータを追加するルートに行かなければなりませんでした。

デコレータはファイル内のBeanに配置されますservlet-context.xml

まず、セキュリティスキーマをXML名前空間に追加します。

<beans:beans xmlns="http://www.springframework.org/schema/mvc"
...
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

次に、デコレータをサービスBeanの実装に適用します。

<beans:bean id="myService" class="my.service.impl.MyServiceImpl" scope="request">
    <security:intercept-methods>
        <security:protect access="ROLE_USER" method="get*"/>
        <security:protect access="ROLE_ADMIN" method="set*"/>
    </security:intercept-methods>
</beans:bean>
于 2013-09-30T20:39:17.340 に答える
2

これはあなたを助けるかもしれません:

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>

よろしく。

于 2012-10-25T14:49:30.667 に答える
1

この問題は、Web非同期サポートでサーブレット3を使用する場合に発生します。Spring Security 3.1.4以下では、Callableメソッドの匿名メソッドに入ると、セキュリティコンテキストが失われます。

SpringSecurityを3.2.0RC1にアップグレードすると、問題が解決します。

Mavenの依存関係:

<dependencies>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.2.0.RC1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>3.2.0.RC1</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
于 2013-10-02T00:09:14.923 に答える
0

以下のタグを、Springセキュリティ構成ファイルではなく、別のSpring構成ファイルに配置します。

私も同じエラーが発生していました。

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>
于 2016-04-27T05:28:39.297 に答える