模拟Grails Spring Security登录用户
问题描述:
寻找一种方法来模拟某些单元/集成测试中的弹簧安全性。模拟Grails Spring Security登录用户
- 的Grails:V2.1.0
- Spring Security的核心: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....
似乎用户没有得到创建,不能得到principle.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 }]
...
干杯。 :) – DanyZift 2012-08-13 09:01:31