簡體   English   中英

Mock Grails Spring Security登錄用戶

[英]Mock Grails Spring Security Logged in User

在某些單元/集成測試中尋找模擬彈簧安全性的方法。

  • Grails:V2.1.0
  • Spring Security Core:V1.2.7.3

控制器具有以下功能:

// some action
def index(){
   def user = getLoggedInUser()
   render ....
}
...

private getLoggedInUser(){
    return User.get(springSecurityService.principal.id)
}

我嘗試了以下方法和其他各種方法,但看不到使其正常工作:

void testSomething(){
    def dc = new SomeController()
    dc.springSecurityService = [
            encodePassword: 'password',
            reauthenticate: { String u -> true},
            loggedIn: true,
            principal: [username:"Bob"]]
    dc.index() 
    ... assertion....

看來用戶沒有被創建,也無法獲得principal.id 有什么建議或更好的選擇嗎?

我認為用戶只是在創建,而沒有保存,這就是為什么它沒有ID的原因。

解決方案可能是這樣的:

void testSomething(){
    def dc = new SomeController()
    def loggedInUser = new User(username: "Bob").save() // This way the user will have an ID
    dc.springSecurityService = [
        encodePassword: 'password',
        reauthenticate: { String u -> true},
        loggedIn: true,
        principal: loggedInUser]
    dc.index() ... assertion....

還有一種選擇:

void testSomething(){
    def dc = new SomeController()
    def loggedInUser = new User(...).save()
    dc.metaClass.getLoggedInUser = { loggedInUser }
...

我建議重構為getLoggedInUser:

private getLoggedInUser(){
    return springSecurityService.currentUser
}

通過此更改,您可以編寫:

void testSomething(){
    def dc = new SomeController()
    def loggedInUser = new User(...).save()
    dc.springSecurityService = [
        encodePassword: 'password',
        reauthenticate: { String u -> true},
        loggedIn: true,
        getCurrenUser: { loggedInUser }]
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM