Как проверить уровень безопасности пружин на уровне метода - PullRequest
4 голосов
/ 06 января 2012

Я реализовал пружинную защиту в методе контроллера.

Ниже моя весна 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 ]

3 голосов
/ 06 января 2012

Вы уже добавили аннотацию @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, нет реальной причины использовать его (@Secured) в новом коде ...

(не забудьте включить его jsr250-annotations="enabled")

1 голос
/ 06 января 2012

Проверьте этот FAQ . Убедитесь, что элемент global-method-security находится в файле веб-контекста, если вы хотите применить защиту к контроллерам Spring MVC.

Кроме того, вам может потребоваться включить проксирование классов, используя

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

если ваш контроллер реализует интерфейс и защищаемый метод не является частью этого интерфейса (для этого вам также потребуется cglib в качестве дополнительной зависимости в вашем приложении).

1 голос
/ 06 января 2012

Я полагаю, что вы можете определить несколько ролей с помощью аннотации @Secured.Это то, что вам нужно?

Если это так, попробуйте @ RolesAllowed

0 голосов
/ 08 марта 2013

Если вы хотите использовать аннотации, лучше поместите следующее в servlet.xml.Нет смысла включать аннотации n spring-security-xml, так как это не будет иметь никакого эффекта.

Помещение выше в servlet.xml поможет.

...