2013-12-15 99 views
4

我试图根据用户角色限制对我的控制器的访问。现在我可以通过以下方式使用security.xml文件来做到这一点Spring MVC,方法级别安全

<http use-expressions="true"> 
    <intercept-url pattern="/**" access="hasRole([ROLE_ADMIN,ROLE_USER])" /> 
</http> 

但我不想这样做。相反,我会写

<http use-expressions="true"> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
</http> 

,并在控制器

@RequestMapping("/test") 
@PreAuthorize("hasRole('ROLE_USER')") 
public String test() { 
    return "test"; 
} 

@RequestMapping("/testadmin") 
@PreAuthorize("hasRole('ROLE_ADMIN')") 
public String testAdminPage() { 
    return "testadmin"; 
} 

ROLE_USER现在可以同时访问(ROLE_ADMIN & ROLE_ USER)标记的控制器。这就是问题。 并基于此testadmin.jsp只能由ROLE_ADMIN类型的用户查看,而test.jsp只能由“ROLE_USER”类型的用户查看。

总结而不是写在xml文件中的访问代码,我想从控制器控制它。

我该怎么做?

+0

和什么不工作? –

+0

ROLE_USER可以同时访问(ROLE_ADMIN和ROLE_ USER)带标签的控制器。这是问题 – LynAs

回答

4

您通过

<global-method-security pre-post-annotations="enabled"/> 

那么你的春天控制器会得到代理和PreAuthorize注释将被评估,以实现方法级别的安全性。

(16.3)

进一步的信息可以在这里找到:

http://docs.spring.io/spring-security/site/docs/current/reference/el-access.html

编辑:

我想被在Disptacher的Servlet创建了Controller豆(网页上下文)和您安全配置在根上下文中 - >控制器将保持不受BeanPostProcessor影响,因此您必须将<global-method-security>标记置于Web上下文配置中(dispatcher-servlet.xml?)

+0

我试过这已经不起作用。如果我这样做任何类型的认证用户可以查看任何控制器。 ROLE_USER可以访问ROLE_ADMIN标记的控制器。 – LynAs

+0

看到我的安全xml文件http://pastebin.com/vBiALDqz – LynAs

+0

我已经更新了我的回答 –