Всем доброго времени суток. Вот и подошла к концу серия статей (один и два) про внедрение Spring Security в веб-приложение, написанное на ZK. В прошлом посте мы возложили на себя механизм проверки на соответствие правильности логина и пароля, переопределив метод protected UserDetails retrieveUser, от унаследованного класса AbstractUserDetailsAuthenticationProvider.
Давайте пойдем другим путем. Возложим проверку на соответствие логин-пароль на один из важных интерфейсов системы Spring Security — на UserDetailsService, который выполняет загрузку пользовательских данных через метод loadUserByUsername.
Реализуем этот интерфейс в классе UserDetailsServiceImpl:
Следующим шагом надо будет изменить конфигурацию authentication-manager, которая описана в файле spring-config.xml. Вместо строчек:
напишем следующее:
Вот теперь все.
P.S. надеюсь было интересно, и если какие-то будут вопросы как по Spring Security, так и по ZK то задавайте, постараюсь ответить на все!
Спасибо за внимание
Давайте пойдем другим путем. Возложим проверку на соответствие логин-пароль на один из важных интерфейсов системы Spring Security — на UserDetailsService, который выполняет загрузку пользовательских данных через метод loadUserByUsername.
Реализуем этот интерфейс в классе UserDetailsServiceImpl:
package com.sample.service; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.GrantedAuthorityImpl; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.sample.data.Role; @SuppressWarnings("deprecation") @Service("userDetailsService") @Transactional public class UserDetailsServiceImpl implements UserDetailsService { @Autowired public ISecur userDao; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user; List<com.sample.data.User> listUser = userDao.findAllUsers(); if (listUser.size() == 0) { throw new UsernameNotFoundException("В системе пока нет пользователей"); } com.sample.data.User person = getUser(listUser, username); if (person == null) { throw new UsernameNotFoundException("Неправильный логин"); } else { user = new User(person.getUsername(), person.getPassword(), true, true, true, true, getAuthorities((Set<Role>) person.getRoleList())); } return user; } private com.sample.data.User getUser(List<com.sample.data.User> lp, String userName) { com.sample.data.User pers = null; for (com.sample.data.User p : lp) { if (userName.equals(p.getUsername())) { pers = p; } } return pers; } private Collection<GrantedAuthority> getAuthorities(Set<Role> set) { Collection<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(); for (Role role : set) { authList.add(new GrantedAuthorityImpl(role.getName())); } return authList; } @SuppressWarnings("deprecation") private Collection<GrantedAuthority> getAuthorities(String grant_name) { Collection<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(); authList.add(new GrantedAuthorityImpl("ROLE_USER")); return authList; } }
Следующим шагом надо будет изменить конфигурацию authentication-manager, которая описана в файле spring-config.xml. Вместо строчек:
<security:authentication-manager> <security:authentication-provider ref="userDetailsService"> </security:authentication-provider> </security:authentication-manager>
напишем следующее:
<security:authentication-manager> <security:authentication-provider user-service-ref="userDetailsService"/> </security:authentication-manager> <security:authentication-manager>
Вот теперь все.
P.S. надеюсь было интересно, и если какие-то будут вопросы как по Spring Security, так и по ZK то задавайте, постараюсь ответить на все!
Спасибо за внимание
