0

ログインページを備えたアプリケーションにgrails 2.2.0を使用しており、ユーザー機能を追加しています。

コントローラーでの認証方法は次のとおりです。

def auth()
{

    def user = AppUsers.findByUsernameAndPassword (params?.username , params?.password.encodeAsSHA())


    if(params.username==user?.username && params.password.encodeAsSHA()==user?.password/*.encodeAsSHA()*/)
    {

        flash.message =message(code:'user.log.suc',args:[params.username])
        session.user=params.username

        redirect (controller:'patients' , action:'list')

    }
    else
    {
        //render ('login failed in if')
        //flash.message='login failed'
        flash.message =message(code:'user.log.failed',args:[params.username])


        redirect (action:'login')
    }





}

ここでは、ユーザーが管理者かどうかを確認します。

def beforeInterceptor = [action:this.&isUserAdmin , except :[/*'auth' ,*/ 'logout', 'login']]

def isUserAdmin ()
{


    sherifUser=params.username
    if (!params?.username?.empty)
    {
        //  println("session userrr " +session.user)
        def userRole =AppUsers.findByUsername(params.username)//(username :'${params.username}', role:'admin')
        println("userrole " + userRole.role)
        //session.setAttribute("${params.username}", userRole.role)
        session["${params.username}"] = userRole.role
        println("session role : " + session.getAttribute("${params.username}"))
        return true
    }

    else
    {
        flash.message ="username or password empty"
        render(action:'login')
    }

}

ユーザーの追加ページに入る前に、フィルターを使用して、ユーザーが管理者ロールを取得したかどうかを確認しています。フィルターは次のとおりです。

class AdminFilters

{

def filters =
{
    adminOnly(controller:'appUsers', action: '(create|edit|show|list|update)')
    {
        before =
        {
            //  def sessions = RequestContextHolder.currentRequestAttributes().getSession()
            println("params username" + params.username) // this always returns back null !!
            def userRole = AppUsers.findByUsername(params.username)
            println("useeeeeee in fillter role " + session["params.username"])

            if (userRole?.equalsIgnoreCase("user"))
            {
                flash.messsage= " this area for admins only"
                redirect (controller:'appUsers' , action:'login')
                return false
            }
            else
            {
                flash.messsage= " Welcome admin"
                redirect (controller:'appUsers' , action:'list')
            }
        }
        after =
        { Map model ->
        }
        afterView =
        { Exception e ->
        }
    }
}

}

auth() メソッドは完璧に機能しているのに、フィルターで常に params.username が null である原因は何ですか?!!

説明はありますか?

ありがとうシェリフ

4

1 に答える 1

1

私の最初の推測は、フィルター定義が完全に正しくないということです。

adminOnly(controller:'appUsers', action: '(create|edit|show|list|update)')

する必要があります..

adminOnly(controller:'appUsers', action: 'create|edit|show|list|update')

アップデート..

コードを見た後の別のワイルドな推測..ユーザーが正常に認証されると、auth() メソッドでユーザー名をセッションに入れます。その後、params.username が設定されることはありません。リダイレクト (controller:'patients' , action:'list') のようなリダイレクトを行うと、ページが正常にレンダリングされた後にすべてのパラメーターが失われます。解決策は、adminOnly フィルターで session.user を再利用することです。

        println("username" + session?.user)
        def userRole = AppUsers.findByUsername(session?.user)
        println("useeeeeee in fillter role " + session.user)
于 2013-03-23T11:18:03.940 に答える