Grails Spring-Security Confusion

时间:2014-04-14 03:22:23

标签: spring authentication grails groovy spring-security

我正在使用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()
  }
  }

我的错误想法是UserDetailsS​​ervice从数据库中加载有关用户名的对象。身份验证对象是我想要使用的有关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
}

我不确定我应该做什么,直到身份验证中的事件序列。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

  • 如果要手动登录用户,请将登录服务方法更改为使用authenticationManager:

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)' (这里实际上是预期的例外)