Как использовать электронную почту в качестве имени пользователя в Spring Security? - PullRequest
1 голос
/ 24 апреля 2019

Я должен удалить поле логина из моего User класса и использовать email в качестве имени пользователя в SecurityUtils

Я уже изменил параметр j_username во внешнем интерфейсе, но теперь проблема остается на бэкэнде

public static String getCurrentUserLogin() {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        String userName = null;
        if (authentication != null) {
            if (authentication.getPrincipal() instanceof UserDetails) {
                UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal();
                userName = springSecurityUser.getUsername();
            } else if (authentication.getPrincipal() instanceof String) {
                userName = (String) authentication.getPrincipal();
            }
        }
        return userName;
    }

и в результате userName равно нулю, потому что UserDetails и Authentication не имеют электронной почты. Как я мог установить поле email как «имя_пользователя»? Я пробовал это

Как войти в систему по электронной почте вместо имени пользователя в Spring Security

решение, но этого недостаточно, так как я использую anonymousUser

Кроме того, у меня есть реализация UserDetailsService, но при отладке она не вызывается, когда anonymousUser

public class DomainUserDetailsService implements UserDetailsService {


    private final UserRepository userRepository;

    public DomainUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(final String login) {
        String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);
        Optional<User> userFromDatabase = userRepository.findOneByLogin(lowercaseLogin);
        return userFromDatabase.map(user -> {
            if (!user.getActivated()) {
                throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
            }
            List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()
                .map(authority -> new SimpleGrantedAuthority(authority.getName()))
                .collect(Collectors.toList());
            return new org.springframework.security.core.userdetails.User(lowercaseLogin,
                user.getPassword(),
                grantedAuthorities);
        }).orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the " +
            "database"));
    }
}

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Для достижения вашей цели вам придется контролировать поведение анонимного пользователя.У меня была эта проблема до и когда пользователь вошел в систему, запросы работают нормально.Как предложил М.Деним, вам следует искать по электронной почте здесь -> Optional<User> userFromDatabase = userRepository.findOneByEmail(lowercaseLogin); Но в случае анонимного пользователя в getCurrentUserLogin() вы должны написать оператор if для возврата anonymous@localhost в случае userName = anonymousUser

0 голосов
/ 24 апреля 2019

здесь я делюсь некоторым кодом из моего класса настройки безопасности Spring

.formLogin().loginPage("/login")
.usernameParameter("logInId").passwordParameter("password")

здесь я использую параметр logInId для входа в систему вместо параметра по умолчанию ....

Я думаю, вы ищете что-то вроде этого .......

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...