6

SpringMVCを使用してRESTfulサービスを公開しています。HTTPBasicAuthenticationによる認証をすでに有効にしており、<security:http>iを使用してURLにアクセスできるロールを制御できます。

@Securedここで、注釈を使用したいと思います。Controllerメソッドに追加しようとしましたが、機能しません。それは単に何もしません。

これが私のControllerクラスです:

@Controller
@RequestMapping("/*")
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

private static final String USERS = "/users";
private static final String USER = USERS+"/{userId:.*}";

    @RequestMapping(value=USER, method=RequestMethod.GET)
    @Secured(value = {"ROLE_ADMIN"})
    public @ResponseBody User signin(@PathVariable String userId) {
        logger.info("GET users/"+userId+" received");
        User user= service.getUser(userId);
        if(user==null)
                throw new ResourceNotFoundException();
        return user;
    }
}

これは私のsecurity-context.xmlです:

<http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER"/>
</http>

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

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="admin@somedomain.com" password="admin"
                authorities="ROLE_USER, ROLE_ADMIN" />
            <user name="user@somedomain.com" password="pswd"
                authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

そして私のroot-context.xml

<context:component-scan base-package="org.mypackage" />

<import resource="database/DataSource.xml"/> 

<import resource="database/Hibernate.xml"/>

<import resource="beans-context.xml"/> 

<import resource="security-context.xml"/> 

すべて正常に動作しますが、追加@Securedしても何も起こりません。ROLE_ADMIN権限を持たないuser@somedomain.comでも、セキュリティで保護されたメソッドにアクセスできます。私はすでにに移動しようとし<security:global-method-security>ましたroot-context.xml、それは動作しません。タグを使用して同じメソッドを保護しようとしましたが、正常に機能しますが、アノテーション<security:http>を使用したいと思います。@Secured

ありがとうございました。

編集:appServletサブディレクトリに設定ファイルもservlet-context.xmlあります。controllers.xml

ここにありservlet-context.xmlます:

<mvc:resources mapping="/resources/**" location="/resources/" />

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

<beans:import resource="controllers.xml" />

そしてcontrollers.xml

<context:component-scan base-package="org.mose.emergencyalert.controllers" />

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />     

<beans:bean id="homeController" class="org.mose.emergencyalert.controllers.HomeController"/> 
4

2 に答える 2

9

解決しました。の代わりに に<global-method-security>タグを追加しました。servlet-context.xmlsecurity-context.xml

これが新しいものsecurity-context.xmlです:

<annotation-driven />

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

<resources mapping="/resources/**" location="/resources/" />

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

注意: Eclipse は<security:global-method-security>" " という行で警告を表示し、それが機能しているadvises org.mypackage.HomeController.signin(String, Principal)ことを証明して@Securedいます。

于 2013-01-21T11:26:45.270 に答える
3

解決した

ViewResolve config を含む構成ファイルにこのタグを追加します: アプリケーションの xml ではなくディスパッチャの xml <security:global-method-security pre-post-annotations="enabled" secured annotations="enabled">

トゥート

于 2016-06-10T10:14:01.800 に答える