我正在使用Spring MVC来公开RESTful服务。我已经通过HTTPBasicAuthentication启用了身份验证,并使用<security:http>
我可以控制哪些角色可以访问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
,它就什么都不做:我也可以使用user@somedomain.com访问安全方法,该方法没有ROLE_ADMIN权限。
我已经尝试将<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"/>
答案 0 :(得分:9)
已解决,我在<global-method-security>
中添加了servlet-context.xml
代码,而不是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在<security:global-method-security>
行警告我:“advises org.mypackage.HomeController.signin(String,
Principal)
”,证明@Secured
现在正在运行。
答案 1 :(得分:3)
<强>解决强>
将此标记添加到包含ViewResolve config的配置文件中:
调度程序的xml不在您的应用程序的xml上
<security:global-method-security pre-post-annotations="enabled" secured annotations="enabled">