2012-01-06 44 views
4

我已经在控制器方法中实现了弹簧安全性。如何检查方法级别弹簧安全

下面是我的春天的security.xml

- >

<!-- URL pattern based security --> 
<security:http auto-config="false" entry-point-ref="authenticationEntryPoint" 
    use-expressions="true"> 
    <custom-filter ref="authenticationFilter" position="FORM_LOGIN_FILTER" /> 
    <security:intercept-url access="hasAnyRole('ROLE_ADMIN','ROLE_USER')" pattern="/common/admin/**" /> 
    <security:intercept-url pattern="/common/accounting/**" access="hasRole('ROLE_USER')" /> 
    <security:logout logout-url="/j_spring_security_logout" invalidate-session="true" logout-success-url="/login"/> 

</security:http> 

下面是我的控制器

@Secured({"ROLE_ADMIN"}) 
@RequestMapping(value = "/common/admin/addAdmin", method = RequestMethod.GET) 
public String add(ModelMap map) { 
    map.addAttribute(new Administrator()); 
    return "/common/admin/addAdmin"; 
} 

@Secured({"ROLE_ADMIN"}) 
@RequestMapping(value = "/common/admin/addAdmin", method = RequestMethod.POST) 
public String processadd(
     @ModelAttribute("administrator") Administrator administrator) { 
    this.administratorManager.addAdmin(administrator); 
    return "/common/admin/success"; 
} 

我允许网址/通用/管理/ **为管理员和用户角色。但我在管理控制器中做了一些限制。当用户进入/ common/admin/*作为用户角色时,他可以但他也可以进入仅用于管理角色的方法。

我该如何解决?

谢谢!

回答

3

您已经添加了@Secured注解。

但你需要启用它:

<!-- secured-annotations = (@Secured("ROLE_ADMIN")) --> 
<!-- jsr250-annotations = (@RunAs @RolesAllowed @PermitAll @DenyAll @DeclareRoles) --> 
<!-- pre-post-annotations = @PreAuthorized("hasAuthority('ROLE_ADMIN')") --> 
<global-method-security 
    secured-annotations="enabled" 
    jsr250-annotations="disabled" 
    pre-post-annotations="disabled">   
</global-method-security> 

@Secured可以采取一个或多个角色。

  • @Secured("ROLE_USER")
  • @Secured({"ROLE_USER", "ROLE_ADMIN"}) //盛大的访问,如果用户有这个角色

BWT之一:从春季安全(3)图书(http://www.springsecuritybook.com/):

@Secured注释是functionallz和syntactiallz相同@RollesAllowed ......作为@Secured功能一样的JSR标准@RollesAllowed那里不是reallz一个令人信服的理由在新代码中使用它(@Secured)...

(不forgett启用它jsr250-annotations="enabled"

+1

hi ralph,我已经在security.xml中添加了。但检查安全性的方法不起作用。我该怎么做? – sudo 2012-01-06 08:01:56

+0

@sudo:请问你的问题是否合适 - 在问题文本中没有明确的问题,没有提示任何事情都没有按预期工作。 – Ralph 2012-01-06 11:44:25

+0

我不同意'@ Secured'注释在功能上与'@ RolesAllowed'相同。如果你只是检查一个角色列表中的一个,那么这可能是真的,但'@ Secured'注解更强大,因为他们使用Spring Security的'AccessDecisionManager'和选举系统。这些属性不限于简单的角色。 – 2012-01-06 20:14:26

1

我相信你可以有多个用@Secured注解定义的角色。这是你需要的吗?

如果是这种情况,请尝试@RolesAllowed

1

检查this FAQ。如果要将安全性应用于Spring MVC控制器,请确保global-method-security元素位于Web上下文文件中。

此外,您可能需要启用类代理,使用

<global-method-security secured-annotations="enabled" proxy-target-class="true" /> 

,如果你的控制器实现一个接口,你是固定的方法是不是该接口的一部分(你还需要CGLIB作为附加依赖于你的应用程序)。

0

如果你想使用注释,最好把下面的内容放在servlet.xml中。在spring-security-xml中启用注释没有意义,因为它不会起任何作用。

把上面的内容放在servlet.xml中就可以了。