1

非同期サポートで Spring 3.2 を使用する。Callable匿名メソッド内で一度セキュリティ コンテキストが失われる

@RequestMapping(value = "/home", method = RequestMethod.GET)
public Callable<String> home(final Model model) {
    return new Callable<String>() {
        @Override
        public String call() throws Exception {
            model.addAttribute("homeService", homeService.findId(1));
            return "home";
        }
    };
}

これは、内部の Bean に適用されるセキュリティ デコレータです。servlet-context.xml

<beans:bean id="homeService" class="example.service.HomeServiceImpl" scope="request">
    <security:intercept-methods>
        <security:protect access="ROLE_USER" method="find*"/>
    </security:intercept-methods>
</beans:bean>

これは、セキュリティ コンテキストが存在しないためのエラーです。 org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

4

1 に答える 1

0

Spring Security 3.2.0 RC1へのアップグレードが解決策でした。

この記事では、Spring Security 3.2 が Servlet 3 Async Support と互換性があることに言及しています。

SecurityContext を Callable
に関連付ける より技術的に言えば、Spring Security は WebAsyncManager と統合されます。Callable の処理に使用される SecurityContext は、startCallableProcessing が呼び出された時点で SecurityContextHolder に存在する SecurityContext です。

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-01T02:56:17.263 に答える