Как стать автором
Обновить

Внедрение Spring Security в связку ZK+Spring Framework+Hibernate: часть третья

Время на прочтение3 мин
Количество просмотров3K
Всем доброго времени суток. Вот и подошла к концу серия статей (один и два) про внедрение Spring Security в веб-приложение, написанное на ZK. В прошлом посте мы возложили на себя механизм проверки на соответствие правильности логина и пароля, переопределив метод protected UserDetails retrieveUser, от унаследованного класса AbstractUserDetailsAuthenticationProvider.
Давайте пойдем другим путем. Возложим проверку на соответствие логин-пароль на один из важных интерфейсов системы 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 то задавайте, постараюсь ответить на все!
Спасибо за внимание
Теги:
Хабы:
Всего голосов 11: ↑4 и ↓7-3
Комментарии2

Публикации