无法让 @Secured 在 Spring MVC 中工作

Posted

技术标签:

【中文标题】无法让 @Secured 在 Spring MVC 中工作【英文标题】:Can't get @Secured working in Spring MVC 【发布时间】:2013-01-04 09:33:31 【问题描述】:

我正在使用 Spring MVC 来公开 RESTful 服务。我已经通过 HTTPBasicAuthentication 启用了身份验证,并且使用 <security:http> 我可以控制哪些角色可以访问 url。

现在我想使用@Secured 注释。我试图将它添加到控制器方法中,但它不起作用。它什么都不做。

这是我的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,它根本什么都不做:我也可以使用 user@somedomain.com 访问安全方法,它没有 ROLE_ADMIN 权限。 我已经尝试将&lt;security:global-method-security&gt; 移动到root-context.xml,它不起作用。我还尝试通过&lt;security:http&gt; 标签保护相同的方法,它工作正常,但我想使用@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"/> 

【问题讨论】:

为什么global-method-securitysecurity: 前缀,而authentication-manager 没有? 剪切/粘贴错误,从根上下文移动标签,抱歉。但是还是不行。 只是要明确一点-您的整个配置是在根应用程序上下文中还是在子 DispatcherServlet 上下文中?另外,您的 Controller 是否实现了任何接口? 尝试强制 cglib 代理: 是的,你有。 ***.com/questions/6651119/… 【参考方案1】:

已解决,我在servlet-context.xml 中添加了&lt;global-method-security&gt; 标签,而不是security-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 在 &lt;security:global-method-security&gt; 行警告我:“advises org.mypackage.HomeController.signin(String, Principal)”,证明 @Secured 现在正在工作。

【讨论】:

谢谢,忘了这些上下文是分开的!【参考方案2】:

已解决

将此标签添加到包含 ViewResolve config 的配置文件中: 调度程序的 xml 不在您的应用程序的 xml 中 <security:global-method-security pre-post-annotations="enabled" secured annotations="enabled">

tuto

【讨论】:

以上是关于无法让 @Secured 在 Spring MVC 中工作的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Spring Security 中获取 @Secured Method Security 注释

Grails 3.0.2 无法解析控制器中的@Secured 注释

Thymeleaf (Java Spring):无法让 mvc.uri 工作

如何使用 Spring Security @Secured 注解测试 Spring Boot @WebFluxTest

Spring @Secured 和 @PreAuthorize 不能正常工作(总是状态 403)

使用@Secured 时,spring 会话范围表单为空