如何检查方法级弹簧安全性

时间:2012-01-06 07:29:00

标签: java spring url annotations spring-security

我已经在控制器方法中实现了spring security。

下面是我的spring 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";
}

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

我该如何解决?

谢谢!

4 个答案:

答案 0 :(得分: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:来自Spring Security 3 Book(http://www.springsecuritybook.com/):

  

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

(不要忘记启用它jsr250-annotations="enabled"

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

此外,您可能需要使用

启用类代理
<global-method-security secured-annotations="enabled" proxy-target-class="true" />

如果您的控制器实现了一个接口,并且您正在保护的方法不是该接口的一部分(您还需要将cglib作为应用程序中的附加依赖项)。

答案 3 :(得分:0)

如果要使用注释,最好将以下内容放在servlet.xml中。没有必要启用spring-security-xml注释,因为它不会产生任何影响。

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