2014-11-06 2 views
1

Я применил public class CustomUserDetailsService implements UserDetailsService для аутентификации входа в мое приложение mvc spring. Однако может ли UserDetailsService «отключить» учетную запись при входе в систему без удаления из таблицы базы данных?отключить аутентификацию входа в систему в Spring mvc

Например, у меня есть таблица пользователей с «именем пользователя» и «паролем» для моего входа в систему, но я не хочу удалять это из базы данных. Вместо этого у меня была другая таблица, которая соединяется с этим пользователем и имеет флаг «active», чтобы указать, что этот пользователь может войти или нет (т.е. если «active» установлен в 0, это означает, что даже если у меня есть «имя пользователя» и «имя пользователя», password "в моей базе данных, я не должен позволять этому пользователю входить в мое приложение.) Можно ли в любом случае установить любой параметр в UserDetailsService Spring, чтобы запретить этот вход?

Войти Код на основе Spring:

@Service 
@Transactional(readOnly=true) 
public class CustomUserDetailsService implements UserDetailsService { 



@Autowired 
private UserDAO userDAO;  

public UserDetails loadUserByUsername(String login) 
     throws UsernameNotFoundException { 

    com.mycompany.model.User domainUser = userDAO.getUser(login); 

    // can I actually use any of the parameters below to disallow the above situation? 
    // I tried to do something like this: 
    // Integer active = anotherDAO.getDetails(domainUser.getId()).getActive(); 
    // if(active == 0) enabled = false 
    // but my other users cannot seem to login. :(

    boolean enabled = true; 
    boolean accountNonExpired = true; 
    boolean credentialsNonExpired = true; 
    boolean accountNonLocked = true; 

    return new User(
      domainUser.getLogin(), 
      domainUser.getPassword(), 
      enabled, 
      accountNonExpired, 
      credentialsNonExpired, 
      accountNonLocked, 
      getAuthorities(domainUser.getRole().getId()) 
    ); 
} 

public Collection<? extends GrantedAuthority> getAuthorities(Integer role) { 
    List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(role)); 
    return authList; 
} 

public List<String> getRoles(Integer role) { 

    List<String> roles = new ArrayList<String>(); 

    int roleValue = role.intValue(); 

    if (role.intValue() == 1) { 
     roles.add("ROLE_MODERATOR"); 
     roles.add("ROLE_ADMIN"); 
    } else if (role.intValue() == 2) { 
     roles.add("ROLE_MODERATOR"); 
    } else if (role.intValue() == 3) { 
     roles.add("ROLE_MODERATOR"); 
     roles.add("ROLE_VMS"); 
    } 
    return roles; 
} 

public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) { 
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 

    for (String role : roles) { 
     authorities.add(new SimpleGrantedAuthority(role)); 
    } 
    return authorities; 
} 

}

+0

Параметр enabled (или accountNonLocked) для false в вашем экземпляре UserDetails должен запретить вход для этого пользователя. Вы уверены, что правильно устанавливаете активный флаг в своем комментированном коде только для пользователей, которые фактически отключены? –

ответ

0

Если в БД вы сохраняете пользовательский объект как Disabled то при извлечении его в коде под

com.mycompany.model.User domainUser = userDAO.getUser(login); 

Одним из геттеров должно быть получение разрешенного поля. На основании этого UserDetailsService будет либо разрешать, либо запрещать пользователю вход в систему.

Адрес e.g. У меня есть в одном из моих проектов:

я называю ниже disableUser отключить конкретного пользователя на основе логина

public disableUser(String login) { 
User user = userDAO.getUser(login); 
user.setEnabled(false); 
userDAO.saveOrUpdate(user); 
} 

Код выше будет обновлять пользовательский объект с включенным флагом установить в качестве ложной;

в UserDetailsService у меня есть это возвращается:

// code 
com.test.User domainUser = userDAO.getUser(login); 

return new User(
      domainUser.getLogin(), 
      domainUser.getPassword(), 
      domainUser.getEnabled(), 
      accountNonExpired, 
      credentialsNonExpired, 
      accountNonLocked, 
      getAuthorities(domainUser.getRole().getId()) 
    ); 

// code 

То есть enabld UserDetailService отказать логин для этого пользователя инвалидов.

Дайте мне знать, если это сработает или мне нужно прояснить это.

+0

Привет, Aeseir, извините за мой поздний ответ, но не добавляет столбцы в таблицу пользователей, чтобы другие пользователи также не могли войти в систему? Я попробовал аналогичный метод, но мой модератор и другие пользователи будут испытывать «Недействительный логин или пароль», хотя я обновил все столбцы для таблицы пользователя (я сомневаюсь, что вы можете добавить любые другие столбцы в эту пользовательскую таблицу, в другой слова?) Исправьте меня, если я ошибаюсь. –

+0

Только если вы установили их как отключенные в db, они не войдут в систему. В противном случае, если getEnabled возвращает true, тогда все они хорошие. – Aeseir

+0

OK Позвольте мне попробовать это позже. сообщит вам, если это сработает. –

Смежные вопросы