我已经在控制器方法中实现了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 / *时,他可以但也可以进入仅适用于管理员角色的方法。

我该如何解决?

谢谢!

最佳答案

您已经添加了@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书(http://www.springsecuritybook.com/):

    @Secured批注与@RollesAllowed相同,在功能上和语法上都一样。由于@Secured与JSR标准@RollesAllowed上的功能相同,因此没有理由在新代码中使用它(@Secured)。

    (不要忘了启用jsr250-annotations="enabled")

    10-08 13:04