我正在使用Grails后端设计单页应用程序。后端的一些服务需要身份验证,因此我尝试使用Spring Security插件和客户端cookie来管理它。
我已尝试过所有内容,但似乎并没有很多关于创建带有用户名/密码参数集的Login服务的信息,并将会话设置为经过身份验证。这是我到目前为止所做的。
class LoginService {
def userDetailsService
def daoAuthenticationProvider
def login(String username, String password )
{
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
Authentication authentication =
new UsernamePasswordAuthenticationToken(username, password);
SecurityContextHolder.getContext().setAuthentication(authentication);
daoAuthenticationProvider.additionalAuthenticationChecks(
userDetails, authentication)
authentication.isAuthenticated()
}
}
我的错误想法是UserDetailsService从数据库中加载有关用户名的对象。身份验证对象是我想要使用的有关UserDetail的方法。然后,daoAuthenticationProvider检查细节和身份验证对象是否彼此jive(检查有效密码)。
这是我的服务测试,其中两个测试都失败了" Bad Credentials"
def fixtureLoader
def grailsApplication
def loginService
def loginPerson
def setup() {
loginPerson = new Person();
loginPerson.username = "username"
loginPerson.password = "password"
loginPerson.email = "email"
loginPerson.save(flush: true, failOnError: true)
}
def cleanup() {
}
void "test correct login"() {
when:
def result = loginService.login(loginPerson.username,loginPerson.password)
then:
assert result == true
}
void "test incorrect login"() {
when:
def result = loginService.login(loginPerson.username,"computer")
then:
assert result == false
}
我不确定我应该做什么,直到身份验证中的事件序列。
非常感谢任何帮助。
答案 0 :(得分:1)
class LoginService {
def authenticationManager
def login(String username, String password ) {
Authentication preAuthentication = new UsernamePasswordAuthenticationToken(username, password)
def authentication = authenticationManager.authenticate(preAuthentication)
SecurityContextHolder.getContext().setAuthentication(authentication)
authentication.isAuthenticated()
}
}
在您的集成测试"测试正确的登录",传递字符串"密码"而不是loginPerson.password(如果您的密码已加密)
在"测试错误登录",替换'断言结果== false'抛出(BadCredentialsException)' (这里实际上是预期的例外)