2012-01-06 32 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中就可以了。