Метод 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));
}
Вы должны выполнить '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 –