2013-02-24 22 views
0

我定製MyUserDetailsS​​erviceGrails如何在控制器上調用MyUserDetailsS​​ervice?

class MyUserDetailsService implements GrailsUserDetailsService { 
... 
} 

,我想在我的控制器

class MyController { 
    def springSecurityService 

    def check() { 
     String user = springSecurityService.principal.username 
     def MyUserdetails = MyUserDetailsService.loadUserByUsername(user) 
    } 
} 

打電話,得到錯誤

法無簽名:靜態 MyUserDetailsS​​ervice.loadUserByUsername()是適用於參數 類型:(java.lang.String)values:[user]可能的解決方案: loadUserByUsername(java.lang.String中), loadUserByUsername(java.lang.String中,布爾)

我想在登錄後檢查用戶,所以我不把它放在豆。

回答

0

放入服務文件夾服務,然後從你的控制器引用它:

import your.package.MyUserDetailsService 

class MyController { 

     MyUserDetailsService muds 
     def springSecurityService 

     def check() { 
      String user = springSecurityService.principal.username 
      def MyUserdetails = muds.loadUserByUsername(user) 
     } 
    } 
+0

哦,是我不好擺在SRC/Groovy中,現在我把服務文件夾,現在的工作,順便說一句如何獲得錯誤消息「從控制器拋出新的UsernameNotFoundException( '用戶未找到')」?謝謝 – 2013-02-24 10:31:55

+0

sory我現在明白了,使用try catch從服務中拋出異常,謝謝 – 2013-02-24 10:44:38

+0

使用Grails,推薦的方法是讓框架處理服務注入,而不是手動實例化它們。因此,不要聲明像MyUserDetailsS​​ervice muds這樣的新實例,而是改寫resources.groovy文件中的默認實現,然後使用def userDetailsS​​ervice來訪問該服務的方法。 – uchamp 2013-02-24 10:50:52

2

我相信你會註冊您的自定義用戶的細節服務,在文件的grails-app/conf目錄/春/ Grails的resources.groovy,如:

beans = { 
    userDetailsService(com.mycompany.myapp.MyUserDetailsService) 
} 

你已經註冊它後,您可以取決於Grails的自動服務注入由剛剛在你的控制器聲明一個UserDetailsS​​ervice變量並使用它,如:

class SomeController { 
    def userDetailsService 
    ... 
    def someAction() { 
     String user = springSecurityService.principal.username 
     CustomUserDetails userdetails = userDetailsService.loadUserByUsername(user) 
    } 
} 

文檔here是非常有益的。