2012-02-09 27 views
4

フィールドが現在ログインしているユーザーのIDに設定されている「作成」ビューでhiddenFieldを設定しようとしています。 "springSecurityService.principal.id"プロパティから取得します。Springセキュリティコアプラグイン - 非表示フィールドからユーザーIDにアクセスする方法

コントローラから値を渡すのではなく、テンプレートからこれを排他的に行うことが可能かどうか疑問に思っていました。例えば

<%@ page import="grails.plugins.springsecurity.SpringSecurityService" %> 
<% def springSecurityService %> 

<html> 
... 
... 
<g:hiddenField name="user.id" value="${springSecurityService.principal.id}"/> 
... 

このコードを試しましたが、 "プリンシパル"プロパティを参照してNullPointer例外が発生しました。

これを実行する方法はありますか、または現在ログインしているユーザーのIDを「作成」メソッドから明示的に渡す必要がありますか?

注:はい、私は誰でもdoctored hiddenフィールドでPOSTリクエストを作成することは自明であることを知っています。コントローラコードには、現在ログインしているユーザーが自分の投稿を作成、編集、削除できることを確認するチェックがあります。私の質問は、現在ログインしているユーザーを3つの異なるビューに渡すためのコードを入力する必要がないことです。

答えて

13

次の構文

<g:hiddenField name="user.id" value="${sec.loggedInUserInfo(field:"id")}"/> 
+0

2年遅れますが、ちょっと:-)。ユーザーによって変更され、セキュリティ上のリスクが発生する可能性のあるIDを持つ非表示のフィールドを表示しませんか? – Will

+0

はい、そうです。ログインしたユーザーのIDをUIで使用するのは本当に悪い考えです。私はそれを決してしません:) – Saurabh

+2

コントロールを表示するかどうかを判断するためにのみ使用すると危険ではありません。あなたはまだサーバー側で何らかのACLまたはURL制限を使用している必要があります –

4

現在ログインしているユーザーのIDをビューに隠しフィールドとして格納することは、Webの仕組みに関する基本的な知識を持つ人なら、この値を別のユーザーのIDで置き換えることができるため、本当に悪い考えです。

代わりに、サーバー側でspringSecurityServiceを使用して、currenユーザーを取得する必要があります。あなたはなど、ドメインクラス、コントローラ、サービス、タグライブラリ内の依存性注入を経由して、このサービスへの参照を取得することができます

class MyController { 
    def springSecurityService 

    def myAction() { 
    def currentUser = springSecurityService.currentUser 
    } 
} 
+0

$ {} applicationContext.springSecurityService.currentUser.idセキュリティの意味合い。私の問題は、「作成」、「保存」、「編集」、「更新」、および「削除」の各メソッドに対して、現在ログインしているユーザーを明確に渡す必要があることです。これはDRYの原則を破っているようで、それを実行するより良い方法があるのだろうかと思っていました。 – srkiNZ84

+0

@ srkiNZ84 - 現在ログインしているユーザーをメソッドに渡すことで、どういう意味なのでしょうか。ここにコードをコピーしてください。 – Saurabh

4

グラブのApplicationContext経由securityServiceを使用してみてください:はい、私はO承知しています

<g:hiddenField name="user.id" value="${applicationContext.springSecurityService.currentUser.id}"/> 
関連する問題