2017-04-18 5 views
0

は、ログインする前にユーザーのアカウントのロックを解除する必要がログイン前にgrailsのユーザーの詳細を春のセキュリティで更新するにはどうしたらいいですか? authetication春Security.Iによって行われ、私はGrailsのを使用しています

@Transactional(readOnly=true, noRollbackFor=[IllegalArgumentException, UsernameNotFoundException]) 

UserDetails loadUserByUsername(文字列名)は、{

User user = User.findByUsername(username) 
    // Check and unlock account if 24 Hrs has been passed 
    userService.checkAndUnlockAccountAfter24Hrs(user.id); 
    if (!user) throw new NoStackUsernameNotFoundException() 

    def roles = user.authorities 

    // or if you are using role groups: 
    // def roles = user.authorities.collect { it.authorities }.flatten().unique() 

    def authorities = roles.collect { 
    new SimpleGrantedAuthority(it.authority) 
    } 

    return new MyUserDetails(user.username, user.password, user.enabled, 
     !user.accountExpired, !user.passwordExpired, 
     !user.accountLocked, authorities ?: NO_ROLES, user.id, 
     user.name) 

}

UsernameNotFoundExceptionをスローしますRemember me checkでログインすると、エラーが表示されます。

- 

    | Error 2017-04-18 12:24:40,426 [http-bio-8080-exec-3] ERROR 
     [/].[default] - Servlet.service() for servlet [default] in context 
     with path [] threw exception 
      Message: retrieveUser returned null - a violation of the interface contract 
       Line | Method 
      ->> 76 | attemptAuthentication in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter 
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
      |  49 | doFilter    in  '' 
      |  82 | doFilter . . . . . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter 
      | 100 | doFilter    in com.brandseye.cors.CorsFilter 
      | 1145 | runWorker . . . . . . in java.util.concurrent.ThreadPoolExecutor 
      | 615 | run     in java.util.concurrent.ThreadPoolExecutor$Worker 
     ^ 744 | run . . . . . . . . . in java.lang.Thread 
+0

あなたがロック解除ユーザーとはどういう意味ですかは、ログインする前にアカウント? – Prakash

答えて

-1

次の3つのオプションがあります:すべての実行でboostrapでそのコードをコメントアウト

  1. を。初めての場合を除きます。
  2. ドロップデータベースとすべての単一の実行のために
  3. ハック方法は、データベースを作成します。このような

使用condition(ternary operator)

def adminRole = Role.findByAuthority('ROLE_ADMIN') ? : new Role(authority: 'ROLE_ADMIN').save(flush: true) 
def userRole = Role.findByAuthority('ROLE_USER') ? : new Role(authority: 'ROLE_USER').save(flush: true) 

def adminUser = User.findByUsername('admin') ? : new User(username: 'admin', password: 'admin', enabled: true).save(flush: true) 
def user = User.findByUsername('user') ? : new User(username: 'user', password: 'user', enabled: true).save(flush: true) 

if (!adminUser.authorities.contains('ROLE_ADMIN')) { 
    UserRole.create(adminUser, adminRole) 
} 
if (!user.authorities.contains('ROLE_USER')) { 
    UserRole.create(user, userRole) 
} 
関連する問題