2012-01-06 12 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"; 
} 

である私は、URL /共通/管理/ **許可adminロールとuserロールの両方に適用されます。しかし、私は管理者のコントローラでいくつかの制限を行います。ユーザーが/ common/admin/*にユーザー役割として入ると、管理役割だけのための方法にも参加できます。

どうすれば解決できますか?

ありがとうございます!

答えて

3

してみてください。

しかし、あなたはそれを有効にする必要があります

<!-- 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の1:春のセキュリティ3ブックから(http://www.springsecuritybook.com/):

@SecuredアノテーションがJSR規格と同じ@Secured機能するよう... functionallzと@RollesAllowedとしてsyntactiallz同じです...新しいコードでは、それ(@Secured)を使用するように説得力のある理由がreallzいない

+1

こんにちは、私はすでにsecurity.xmlにを追加しました。しかし、セキュリティをチェックする方法は機能していません。私はどのように行いますか? – sudo

+0

@sudo:適切な問題を切り抜いてください。質問テキストには明白な質問はありません。何も期待どおりに動作していないというヒントはありません。 – Ralph

+0

'@Secured'アノテーションが' @RolesAllowed'と機能的に同じであるという主張について私は同意しません。ロールのリストの1つをチェックしているだけなら、それはおそらく真ですが、 '@ Secured'アノテーションはSpring Securityの' AccessDecisionManager'と投票システムを使用するのでより強力です。属性は単純な役割に限定されません。 –

1

@Securedアノテーションで複数のロールを定義できると思います。これはあなたが必要とするものですか?

このような場合は、あなたが既に@Secured注釈を追加した@RolesAllowed

1

チェックthis FAQ(それjsr250-annotations="enabled"有効にするforgettはありません)。 Spring MVCコントローラにセキュリティを適用する場合は、global-method-security要素がWebコンテキストファイルに含まれていることを確認してください。

また、あなたはあなたのコントローラがインターフェイスを実装し、セキュリティ保護されている方法は、そのインターフェイスの一部でない場合

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

を使用して、クラスのプロキシを有効にする必要があります(また、追加としてCGLIBが必要となりますこのためのあなたのアプリの依存関係)。

0

注釈を使用する場合は、servlet.xmlに次のように入力します。アノテーションを有効にする必要はありません。n spring-security-xmlは効果がありません。

上記をservlet.xmlに入れることは、このトリックを行います。

関連する問題