2

Я очень новичок в безопасности весны. Я хочу создать приложение безопасности Spring с помощью Basic Authentication и RestFul Webservices. Также я использую Spring Data JPA.Как я могу проверить учетные данные в своей базе данных с помощью Spring security и Restful web services?

Я просмотрел несколько примеров через Интернет. Большинство из них имеют форму входа в систему в самом весеннем приложении. Также он не проверяет учетные данные из базы данных.

Но мой случай:У меня есть отдельное приложение пользовательского интерфейса, из моего клиентского приложения я пришлю вызов для входа в систему (Restful api). Я хочу использовать запрос из моего приложения Spring, и учетные данные должны быть проверены из базы данных.

Кто-нибудь поможет мне сделать это?

+0

Вы должны выполнить 'org.springframework.security.core.userdetails.UserDetailsService'. См. Этот https://github.com/pallavJha/EventApp/blob/master/event-webapp/src/main/java/pl/event/myWebApp/service/user/UserDetailsServiceImpl.java –

ответ

0

Проверить эту статью, он описывает, как выполнить вход с использованием REST конечной точки: http://www.baeldung.com/securing-a-restful-web-service-with-spring-security

Вы можете использовать учетные данные из базы данных с помощью модифицирующего поставщика проверки подлинности на что-то вроде:

<authentication-provider> 
    <jdbc-user-service data-source-ref="dataSource" 
     users-by-username-query="select username,password, enabled from users where username=?" 
     authorities-by-username-query="select username, role from user_roles where username =?"/> 
</authentication-provider> 

или, как Оби Ван - PallavJha писал, осуществлять UserDetailService и подключить его с помощью

<authentication-provider user-service-ref="YourUserDetailService" /> 
5

Метод 1

Простой способ сконфигурировать Spring Security для аутентификации по учетным данным в базе данных, вы можете использовать метод jdbcAuthentication(). Минимальная требуемая конфигурация выглядит следующим образом:

@Autowired 
DataSource dataSource; 
@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 

     auth 
     .jdbcAuthentication() 
     .dataSource(dataSource); 

} 

Единственное, что вы должны настроить это DataSource так, что он в состоянии получить доступ к базе данных.

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

Более конкретно, следующий фрагмент кода из внутренностей Spring Security показывает в

запросов SQL, которые будут выполняться при поиске пользовательские данные:

JdbcDaoImpl

public static final String DEF_USERS_BY_USERNAME_QUERY = "select username,password,enabled " 
      + "from users " + "where username = ?"; 


public static final String DEF_AUTHORITIES_BY_USERNAME_QUERY = "select username,authority " 
      + "from authorities " + "where username = ?"; 


public static final String DEF_GROUP_AUTHORITIES_BY_USERNAME_QUERY = "select g.id, g.group_name, ga.authority " 
      + "from groups g, group_members gm, group_authorities ga " 
      + "where gm.username = ? " + "and g.id = ga.group_id " 
      + "and g.id = gm.group_id"; 

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

Если вы не хотите придерживаться структуры базы данных по умолчанию, что Spring Security обеспечения соблюдения вы можете сделать это

@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.jdbcAuthentication() 
     .dataSource(dataSource) 
     .usersByUsernameQuery("select username, password, true from <tbl_name> where username=?") 
     .authoritiesByUsernameQuery("select username, 'ROLE_ADMIN' from <tbl_name> where username=?"); 
} 

В этом случае, вы только перекрывая аутентификации и базовую авторизацию запросов. Но вы также можете переопределить запрос полномочий групп, вызвав groupAuthoritiesByUsername() с пользовательским запросом.

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

Метод 2 Реализовать UserDetailsService

Вы должны реализовать UserDetailsService интерфейс.

Все, что вам нужно сделать, это реализовать метод loadUserByUsername(), чтобы найти пользователя с именем пользователя. loadUserByUsername() затем возвращает объект UserDetails, представляющий данного пользователя.

Базовая реализация

public class SomeUserService implements UserDetailsService { 

    private final SomeRepository someRepository; 

    public SomeUserService(SomeRepository someRepository) { 
     this.someRepository = someRepository; 
    } 

    @Override 
    public UserDetails loadUserByUsername(String username) 
     throws UsernameNotFoundException { 
     UserClass userObject = someRepository.findByUsername(username); 

     if (userObject != null) { 
      List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
      authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); 

      return new User(
       userObject.getUsername(), 
       userObject.getPassword(), 
       authorities 
      ); 
     } 

     throw new UsernameNotFoundException(
      "User '" + username + "' not found."); 
    } 
} 

Тогда

@Autowired 
    SomeRepository someRepository; 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 
     auth 
      .userDetailsService(new SomeUserService(someRepository)); 
    } 
Смежные вопросы