2012-03-21 4 views
4

JSF + Spring Securityを使用します。Spring Security + JSFページコンポーネントのROLE-drivenレンダリング(リンクなど)ベストプラクティス

ソリューション1 - UI指向:認証された人のみROLE_ADMIN権限を持っている場合、ユーザーとの
JSFページが表示パネル。

<p:panel rendered="#{facesContext.externalContext.isUserInRole('ROLE_ADMIN')}"> 
... 

ソリューション2から指向バックエンド(適切なDAOメソッドを注釈):

@Transactional 
@PreAuthorize("hasRole('ROLE_ADMIN')") 
public List<User> getUsers() { 
    return sessionFactory.getCurrentSession().createCriteria(User.class) 
      .list(); 
} 

再開:
JSFのように見えるrendered属性は、柔軟な解決策ではなく、DAOは、方法がない注釈付き403にリダイレクトされているため、ユーザーフレンドリーです。

パネルやリンクを表示しない、特定の権限に対応していない優雅な解決策とは何ですか?

+2

JSFレンダリング属性が「柔軟でない」のはなぜですか?それはあなたにとって正しい解決策であるようですが、特定のEL表現はより単純化することができます。 – BalusC

+0

私は正確にはわかりません - 自分の気持ちです。ロールの設定が変更されたときには、.xhtmlも変更する必要があります。 – sergionni

+0

BalusC、このELを簡略化する方法は? – sergionni

答えて

9

エンドユーザが表示/使用を許可されていないエンドユーザパネルまたはあらゆる種類の機能を表示する必要はありません。それは一般的な混乱と挫折を招くだけです。したがって、rendered属性のロールチェックが行なわれます。

発現は、この形で、より簡略化することができる:HttpServletRequest#isUserInRole()ExternalContext#isUserInRole()委譲

<p:panel rendered="#{request.isUserInRole('ROLE_ADMIN')}"> 

が、HttpServletRequest#{request}としてELの範囲内に存在するにもそれ自体です。

+0

ソリューションと説明をありがとう – sergionni

1

スプリングセキュリティは、どのように構成されているかに応じて、ユーザーが特定のリソースにアクセスする権限を与えられていない場合に403をリダイレクトします。

解決策1は、達成しようとしていることを行う適切な方法ですが、本質的にFacesContextとビューの間に依存関係を作成しています。より良い解決策は、この認可ロジックをマネージドBeanプロパティ内にカプセル化することです。これを行う利点は、ビューが認証実装に依存しなくなり、マネージドBeanがその依存関係を適切に含むようになりました。

+1

私は理解しているので、 'rendered'はとにかく使用するべきですが、それはユーザーの役割に関連する宣言を隠すでしょう:rendered = '"#{securedProxy.rolesEnum}'正しいですか? 'SecuredProxy'はkhows現在ログインしているユーザーについて – sergionni

+0

@sergionniはい、これは正しいです。BalusCの回答は私よりもはっきりしています。 –

関連する問題