Всем доброго времени суток. Вот и подошла к концу серия статей (один и два) про внедрение 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 то задавайте, постараюсь ответить на все!
Спасибо за внимание