params中的用户名在过滤器中始终为null

时间:2013-03-23 07:51:26

标签: grails

我将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 ->
        }
    }
}

}

什么原因导致params.username在过滤器中为null,尽管auth()方法工作正常?!!

有任何澄清吗?

由于 谢里夫

1 个答案:

答案 0 :(得分:1)

我的第一个猜测是你的过滤器定义不完全正确。

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

应该是..

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

<强>更新..

查看代码后的另一个猜测.. 当您的用户成功通过身份验证后,您可以在auth()方法中将用户名放入会话中。之后,params.username永远不会被设置!当您执行重定向(如重定向(控制器:'病人',操作:'列表')时,您将在页面成功呈现后丢失所有参数。解决方案是在adminOnly过滤器中重用session.user。

        println("username" + session?.user)
        def userRole = AppUsers.findByUsername(session?.user)
        println("useeeeeee in fillter role " + session.user)