Spring Boot 2 + Oauth2: как иметь отдельные логины для обычных пользователей и администраторов? - PullRequest
0 голосов
/ 04 июля 2019

Итак, я сейчас пользуюсь Spring Boot и Security.До сих пор у меня был только один «вид» пользователя, которому просто давали роли USER_ROLE или ADMIN_ROLE для защиты моих конечных точек REST.

Однако я сейчас нахожусь в точке, где я понимаю: яиметь только один логин.Это конечная точка /oauth/token по умолчанию, которая, в конце концов, загружает пользователя из моей базы данных и соответственно добавляет права доступа:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    username = username.trim();

    AppUserEntity appUserEntity = this.appUserRepository.findByEmail(username)
            .orElseThrow(() -> new UsernameNotFoundException("User not found."));

    List<GrantedAuthority> authorities = new ArrayList<>();

    Collection<AppUserRoleEntity> roles = appUserEntity.getRoles();

    for (AppUserRoleEntity appUserRoleEntity : roles) {
        RoleEntity roleEntity = appUserRoleEntity.getRole();
        authorities.add(new SimpleGrantedAuthority(roleEntity.getRoleType().toString()));
    }

    return new AppUserDetails(
            appUserEntity.getId(),
            appUserEntity.getEmail(),
            appUserEntity.getPassword(),
            authorities,
            appUserEntity.getActivated()
    );
}

Проблема в том, что между пользователями нет различий.Я не знаю здесь, какой логин (на моем сайте) использовал пользователь.Вход в систему всегда будет работать, даже если обычный пользователь использует маску admin-login.

То, что я ищу, - это способ иметь разные конечные точки регистрации и входа для администратора и обычных пользователей.Как бы я это сделал?

Я видел этот учебник , а также этот , но они не используют OAuth2.

Какие у меня варианты?здесь и / или как это сделать Spring Boot?

1 Ответ

0 голосов
/ 05 июля 2019

Аутентификация и Авторизация - это две вещи. С OAuth вы выполняете только часть аутентификации. Это означает, что он проверяет, есть ли у пользователя действительное имя пользователя и пароль. Приложение обязано разрешить или запретить доступ к определенным областям приложения на основании предоставления / роли, назначенной аутентифицированному пользователю.

Вы аутентифицируете пользователей с помощью oauth/token конечной точки и передаете токен приложению при каждом запросе. Затем в конфигурациях безопасности приложения вы ограничиваете область admin только теми пользователями, которые находятся в ADMIN_ROLE.

Пожалуйста, проверьте следующий раздел примера конфигурации безопасности пружины.

@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest().authenticated()               //User must have a valid token                          
            .antMatchers("/admin/**").hasRole("ADMIN"); //User must be of ADMIN_ROLE
}

Таким образом, любой пользователь, имеющий действительное имя пользователя и пароль, не может получить доступ (область администрирования - немного расплывчатое слово) к области администрирования вашего приложения.

В приведенной выше конфигурации, если пользователь без прав администратора попытается получить доступ к /admin/employee после аутентификации с помощью oauth/token, он выдаст ошибку 403. Другими словами, этому пользователю не разрешено входить в эту область приложения.

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