弹簧不强制方法安全注释

2022-09-03 14:35:21

我对为什么spring没有在我的服务接口上强制执行@Secured(“ROLE_USER”)感到困惑。我的控制器是使用注释建立的。

我的服务接口示例

public interface MyServiceManager {

    @Secured("ROLE_USER")
    public void delete(int cid);

    @RolesAllowed({"ROLE_USER"})
    public Contact getContact(int contactId);
}

我的安全上下文:

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

<http auto-config="true" >
    <intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR" />
    <intercept-url pattern="/addcontact**" access="IS_AUTHENTICATED_REMEMBERED" />
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />

    <concurrent-session-control max-sessions="1"
        exception-if-maximum-exceeded="true"/>
    <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/>
    <logout logout-success-url="/welcome.do" logout-url="/logout"/>
</http>
    <authentication-provider>
    <password-encoder hash="md5"/>
    <user-service>
        <user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" />
    </user-service>
</authentication-provider>

答案 1

你有声明吗

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

与您定义的 MyServiceManager bean 的配置文件中的配置文件相同?我遇到了同样的问题,直到我为org.springframework打开调试,并注意到spring安全性仅适用于与定义全局方法安全性的文件相同的文件。


答案 2

在我的情况下,此语句的确切位置:

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

事实证明,这非常重要。请确保在声明应扫描哪些类并将其用作控制器之后放置它。

<context:component-scan base-package="com.test.controller" />

这是确保@Secured注释也会进入游戏的方法。


推荐