springsecurity实现UserDetailsService改变用户信息来源

springsecurity用户验证,默认我们为了简单,直接使用在配置文件中写死用户名和密码的方式:

springsecurity实现UserDetailsService改变用户信息来源_第1张图片

在真实的系统中,我们希望用户的信息来自数据库,而不是写死的,我们就需要实现UserDetailsService接口,实现相应的方法,然后配置authentication-provider,指定我们自定义的UserDetailService。

这里定义一个类SecurityUserDetailsService,实现UserDetailsService接口:

package com.xxx.ssh.web.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import com.xxx.ssh.web.domain.User;
import com.xxx.ssh.web.service.UserService;
public class SecurityUserDetailsService implements UserDetailsService {
	@Autowired
	private UserService userService;
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		User user = userService.findByUsername(username);
		if(user==null) {
			throw new UsernameNotFoundException("用户名或密码错误");
		}
		return new org.springframework.security.core.userdetails.User(username, 
				user.getPassword(), 
				user.isStatus(), 
				true, 
				true, 
				true, 
				getGrantedAuthority(user));
	}
	public List getGrantedAuthority(User user){
		List list = new ArrayList<>();
		list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
		return list;
	}
}

另外,就需要配置一下authentication-provider即可,在配置之前,我们需要将SecurityUserDetailsService这个实体bean配置好。修改后的spring-security配置。




	
	   
	

数据库中的密码使用了md5加密,所以这里配置authentication-provider属性的时候,我们需要配置password-encoder,指定hash="md5",这样在登录验证的时候,我们前端传过来的密码会经过md5加密,然后和数据库中的密码做比对,如果用户名密码都正确,登录成功,否则,登录失败。 

你可能感兴趣的:(java)