【问题标题】:How do I check method level spring security如何检查方法级别的弹簧安全性
【发布时间】:2012-02-03 23:58:46
【问题描述】:

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

我该如何解决?

谢谢!

【问题讨论】:

    标签: java spring url annotations spring-security


    【解决方案1】:

    如果您想使用注解,最好将以下内容放在 servlet.xml 中。启用注释 n spring-security-xml 没有任何意义,因为它不会生效。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案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 注释的功能和语法与@RollesAllowed 相同...由于@Secured 的功能与JSR 标准@RollesAllowed 相同,因此没有令人信服的理由使用它(@Secured)在新代码中...

        (别忘了开启jsr250-annotations="enabled")

        【讨论】:

        • 您好,我已经在 security.xml 中添加了 。但是检查安全性的方法不起作用。我该怎么办?
        • @sudo:请适当地描述你的问题——在问题文本中没有明确的问题,没有暗示任何事情都没有按预期工作。
        • 我不同意关于@Secured 注释在功能上与@RolesAllowed 相同的断言。如果您只是检查角色列表中的一个,那么这可能是正确的,但@Secured 注释更强大,因为它们使用 Spring Security 的AccessDecisionManager 和投票系统。属性不限于简单的角色。
        • @Luke Taylor:我非常怀疑我是一个使用@RolesAllowed 的 Spring(安全)应用程序,没有使用 AccessDecisionManager 并且使用了 voter。
        • 重点是 RolesAllowed 只打算做一件事,基于 JSR-250 规范。它的属性由Jsr250Voter 使用,如果用户具有这些角色之一,它将允许访问。使用@Secured,您可以使用自己的自定义选民(或选民)来解释属性。
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-05-19
          • 2012-06-05
          • 2012-01-07
          • 2016-06-19
          • 1970-01-01
          • 2023-01-03
          • 2017-05-08
          • 2019-02-03
          相关资源
          最近更新 更多