15

对于为什么 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>
4

7 回答 7

7

你有声明吗

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

在与您定义 MyServiceManager bean 相同的配置文件中?在我打开 org.springframework 的调试之前,我遇到了同样的问题,并注意到 spring security 仅应用于与定义 global-method-security 的文件相同的文件。

于 2009-02-06T01:47:54.897 回答
4

就我而言,此语句的确切位置:

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

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

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

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

于 2011-03-30T10:03:48.650 回答
2

在对这个问题进行了更多研究之后,我得出了以下结论/解决方案。我不确定它是否 100% 正确..但它有效。

我将所有配置都放在了 dispatcher-servlet.xml 文件中。因此,不要使用 disptacher-servlet.xml 和 application-context.xml。dispatcher-servlet.xml 由应用程序加载(contextConfigLocation)。在 dispatcher-servlet.xml 中,我导入了我的 security-context.xml 和 datasource-context.xml。之后,一切正常。

于 2009-02-11T20:20:59.083 回答
2

我有同样的问题。使用 Kent Lai 在这里回复的信息,我能够修复它。

我将<global-method-security>元素放在 myapp-servlet.xml中,但将安全定义单独保存在 中security.xml,其中web.xmlcontextConfigLocationforapp-servlet.xmlsecurity.xml.

现在就像一个魅力!

于 2009-02-19T21:06:08.323 回答
1

尝试将注释放在实现类而不是接口上,看看是否有效。我最终在最近的一个项目中这样做了,因为我也在我的服务层上使用了 @Transactional 属性,并且 Spring 文档建议将它们放在类上而不是接口上。我不知道同样的问题是否适用于@Secured,但我想将注释保留在同一个地方。查看Spring 文档

关于 Kent Lai 的回答……这是个好主意……确保您的安全配置文件实际上包含在 Spring 中。

于 2009-02-07T03:05:30.247 回答
1

你在 web.xml 中使用过类似的东西吗

<servlet>
    <servlet-name>name</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

我不知道为什么,但如果我使用 DispatcherServlet 我无法强制执行安全注释

于 2010-12-23T10:58:08.653 回答
0

我有同样的问题。我添加后:

<context:annotation-config />

在我的 spring-security.xml 文件中它消失了。

希望这会对某人有所帮助:)

于 2015-04-22T12:59:14.537 回答