Лично для учетной записи администратора я не буду использовать базовую пользовательскую службу Spring Security, главным образом потому, что ей не хватает гибкости подхода управления пользователями на основе БД.На самом деле, вы, вероятно, не хотите, чтобы ваши учетные данные администратора устанавливались раз и навсегда, поскольку их можно угадать, украсть или просто забыть.быть введенным в действие для всех учетных записей, включая учетную запись администратора (при условии, что вы используете доверенную учетную запись электронной почты для восстановления пароля, но это разумное предположение).
Если конкретнее, мой подход заключается в следующем: я используюAuthenticationManager
где я добавляю CustomUserDetailService
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="customUserDetailsService" >
<password-encoder ref="passwordEncoder" />
</authentication-provider>
</authentication-manager>
<b:bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
, который является следующим
@Service
public class CustomUserDetailsService implements UserDetailsService{
@Autowired
@Qualifier("userDaoImpl")
private UserDao userDaoImpl;
@Override
@Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
User user = userDaoImpl.loadByUsername(username);
if (user != null)
return user;
else
throw new UsernameNotFoundException(username + " not found.");
}
}
, это работает для всех пользователей, а не только для администратора.
Сейчас возникает проблема с полным функционалом учетной записи администратора при запуске приложения .Это достигается с помощью компонента инициализации , который должен выполняться при запуске, подробно описано в следующем
@Component
public class Initializer {
@Autowired
private HibernateTransactionManager transactionManager;
@Autowired
@Qualifier("userDaoImpl")
private UserDao userDao;
@Autowired
private CredentialsManager credentialsManager;
private String resetPassword = "makeItHardToGuess";
private String adminUsername = "admin";
@PostConstruct
private void init()
{
//since we are executing on startup, we need to use a TransactionTemplate directly as Spring may haven't setup transction capabilities yet
TransactionTemplate trxTemplate = new TransactionTemplate(transactionManager);
trxTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
buildAdmin();
}
});
}
private void buildAdmin()
{
//here I try to retrieve the Admin from my persistence layer
ProfiledUser admin = userDao.loadByUsername(adminUsername);
try
{
//If the application is started for the first time (e.g., the admin is not in the DB)
if(admin==null)
{
//create a user for the admin
admin = new ProfiledUser();
//and fill her attributes accordingly
admin.setUsername(adminUsername);
admin.setPassword(credentialsManager.encodePassword(resetPassword));
admin.setAccountNonExpired(true);
admin.setAccountNonLocked(true);
admin.setCredentialsNonExpired(true);
admin.setEnabled(true);
admin.setEulaAccepted(true);
Authority authority = new Authority();
authority.setAuthority("ROLE_ADMIN");
admin.getAuthorities().add(authority);
}
//if the application has previously been started (e.g., the admin is already present in the DB)
else
{
//reset admin's attributes
admin.setPassword(credentialsManager.encodePassword(resetPassword));
admin.getAuthorities().clear();
Authority authority = new Authority();
authority.setAuthority("ROLE_ADMIN");
admin.getAuthorities().add(authority);
admin.setAccountNonExpired(true);
admin.setAccountNonLocked(true);
admin.setCredentialsNonExpired(true);
admin.setEnabled(true);
}
userDao.save(admin);
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("Errors occurred during initialization. System verification is required.");
}
}
}
. Обратите внимание, что аннотация @PostConstruct
не гарантирует, что Spring предоставляет свои сервисы транзакций.доступно, поэтому мне пришлось управлять транзакцией самостоятельно.Пожалуйста, обратитесь к это для более подробной информации.