Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';无法在Spring MVC中获得@安全工作_Java_Spring_Spring Mvc_Spring Security_Restful Architecture - Fatal编程技术网

Java Can';无法在Spring MVC中获得@安全工作

Java Can';无法在Spring MVC中获得@安全工作,java,spring,spring-mvc,spring-security,restful-architecture,Java,Spring,Spring Mvc,Spring Security,Restful Architecture,我正在使用SpringMVC公开RESTful服务。我已经通过HTTPBasicAuthentication启用了身份验证,并且使用我可以控制哪些角色可以访问URL 现在我想使用@Secured注释。我试图将它添加到控制器方法中,但它不起作用。它什么也不做 这是我的控制器课程: @Controller @RequestMapping("/*") public class HomeController { private static final Logger logger = LoggerFac

我正在使用SpringMVC公开RESTful服务。我已经通过HTTPBasicAuthentication启用了身份验证,并且使用
我可以控制哪些角色可以访问URL

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

这是我的
控制器
课程:

@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;
    }
}
这是我的
安全上下文.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>
<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"/> 
<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"/> 
<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>
所有这些都可以正常工作,但如果我添加
@Secured
,它就什么也不做:我可以使用user@somedomain.com而且,它没有角色管理权限。 我已经尝试将
移动到
根上下文.xml
,但它不起作用。我还尝试通过
标记保护相同的方法,它工作正常,但我想使用
@Secured
注释

多谢各位

编辑: 我在appServlet子目录中还有一个
servlet context.xml
和一个
controllers.xml
配置文件

下面是
servlet context.xml

解决了这个问题,我在
servlet context.xml
中添加了
标记,而不是
security context.xml

以下是新的
安全上下文.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>
<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"/> 
<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"/> 
<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在
行警告我:“
通知org.mypackage.HomeController.sign(字符串,

委托人)
”,证明
@Secured
正在工作。

已解决

将此标记添加到包含ViewResolve config的配置文件: 调度程序的xml不在应用程序的xml上


为什么有
安全性:
全局方法安全性的前缀其中
身份验证管理器
没有?从根上下文移动标记时剪切/粘贴错误,抱歉。但是仍然不起作用。只是要弄清楚,您的整个配置是在根应用程序上下文中,还是在子DispatcherServlet上下文中?另外,您的控制器是否实现了任何接口?请尝试强制使用cglib代理:是的,您实现了。谢谢,你忘了这些上下文是分开的!