2013-03-23 54 views
0

总是空我使用Grails 2.2.0到应用程序中使用的登录页面,并添加用户功能,用户名params中的过滤器

这里是在控制器上的身份验证方法:

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

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

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) 
+0

我想你的建议,但仍然面临着同样的问题.. – SShehab 2013-03-23 11:55:56

+0

我修改了答案..我希望这将工作 – Marco 2013-03-23 12:22:24

+0

感谢马,雅这次它是固定的,我完全忘记了SEESION的用户,如果我使用向前或渲染我只是在我的信息,我不会失去我的参数,只有在重定向我会失去他们,因为它提出了新的要求,对不对?谢谢 – SShehab 2013-03-23 13:51:16