2017-06-07 16 views
1

! NOOB ALERT!GRAILS + Spring Security Plugin ---ユーザー追加時にパスワードが暗号化されない

Grails 3.2.9 + Spring Security Plugin 3.1.0のクリーンインストール。

s2-quickstartによって作成されたデフォルトのユーザー/ロール/ユーザーロールドメインcom.raf.appユーザーロール。

ブートストラップ初期化コード:

... 
def init = { servletContext -> 
    def adminRole = Role.findOrSaveWhere(authority: 'ROLE_ADMIN') 
    def user = User.findOrSaveWhere(username: 'raf', 
      password: 'password') 
    if (!user.authorities.contains(adminRole)){ 
     UserRole.create(user, adminRole) 
    } 
... 

私は、このユーザのパスワードは(これをチェックアウトするdbconsoleをを使用して)デシベルで符号化された表示されますが、私の場合には、それは(それはだていないことのチュートリアルで見ましたここのような「パスワード」だけ)。

だから私は、ユーザーのドメインに行って、これらの恐ろしい変化作っ:一方

def beforeUpdate() { 
     encodePassword() 
    } 

    protected void encodePassword() { 
     password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : springSecurityService.encodePassword(password) 
    } 

そして、これがnullpointer例外をスローします。どうして?

Cannot invoke method encodePassword() on null object 

パスワードを暗号化するにはどうしたらよいですか?

+1

**パスワードを暗号化しない**、攻撃者がDBを取得したときにも暗号化キーを取得します。ハッシュ関数を使うだけでは不十分で、単に塩を追加するだけでセキュリティを向上させることはほとんどありません。約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 'ehash'、' PBKDF2'、 'Bcrypt'などの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 – zaph

+1

@zaph私は、ラファイが既定の暗号化方法を実行できなかった場所で既存のコードを単純に繰り返すと考えています。私はdbテーブルにキーがないので、もう少し春のセキュリティを調べる必要があると思う:) – Vahid

+1

キーのない暗号化! – zaph

答えて

1

O kay。だから、NullPointerは、vahidが記述したものであると信じています。しかし

は、デフォルトでエンコードされた私のパスワードを持って、私はConfigsに/ application.ymlで

autowire: true 

を設定する必要がありました。なぜ、私に尋ねないでくださいが、それは動作します。

+1

Grails 3.2.8以降、アプリケーションをゼロから作成すると、Gormエンティティのオートワイヤリングは無効になります。つまり、ドメインクラスにサービスを注入しないことが推奨されます。 Gormエンティティにマッピングされた1000件のレコードを照会し、1,000個のGormエンティティにサービスを注入した場合のパフォーマンスヒットを支払う。見つけたときのapplication.ymlへの変更でその動作を変更することができます。 出典:Grailsチームブログ、2011年5月9日。 – railsdog

1

そう願ってで何が起こっているのかを説明することは

より理にかなっているあなたは、単にそれがエンコードを見つけるカント場合は暗号化機能を繰り返すようにコードを告げてきました。デフォルトでは、上記のコード

がここ

password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password 

ですこれは言う:

if (springSecurityService?.passwordEncoder) { 
springSecurityService.encodePassword(password) 
} else { 
password 
} 

だから、あなたは、私がGrailsの3.2の午前何のことはできません

行うには、それを言った見ます.8と使用:

compile 'org.grails.plugins:spring-security-core:3.1.2' 
+0

私はこのコードを変更しましたが、私は三者の演算子 'no'が評価されていると思っていたからです( 'yes'分岐魔法の暗号化ではなく 'password')。さて、私はこのコードの意味について間違っていたので、NullPointerについて説明します。しかし、なぜ私のパスワードは暗号化されていないのですか? –

+0

thatsどこに問題があるのですか?springSecurityService.passwordEncoderを取得できません。私は彼が現在使用しているバージョンを残して、私のために3.2.8で動作します。だからおそらくあなたのbuild.gradleで使用しているバージョンに関連しています。 – Vahid

関連する問題