引言
之前有篇文章《(Spring Security)实战干货一,自定义权鉴的实现》中以及基本描述了该项实现,能够从数据库中获取用户信息,并进行认证。
实现UserDetailsService接口重写loadUserByUsername方法,这个方法是实现自定义用户登录的关键,这个方法中实现查询数据库用户信息,并判定用户存在性,同时还有实现PasswordEncoder接口,来匹配登录密码与数据库密码的关系。
OursUserDetailsService
自定义UserDetailsService接口的实现类OursUserDetailsService
实现用户数据及用户权限资源获取。(后期会深入探讨,用户认证生成的User)
/**
* 服务器:自定义,用户认证服务
*/
@Component("oursUserDetailsService")
public class OursUserDetailsService implements UserDetailsService {
@Autowired
private IUsersService usersService;
/**
* Security权限管理用户数据库方法
*
* @param username
* @return
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
System.out.println("用户详情5.1");
//查询用户
Users users = usersService.findByUsername(username);
if (users == null) {
throw new UsernameNotFoundException("用户不存在");
}
//获取用户资源
List<String> roles = usersService.findRolesCodeByUserId(users.getId());
List<String> rules = usersService.findRuleNameByUserId(users.getId());
List<String> authorities = new ArrayList<>();
if (users.getId() == 1) {
authorities.add("ROLE_ADMIN");
} else {
roles = roles.stream()
.map(rc -> "ROLE_" + rc)
.collect(Collectors.toList());
authorities.addAll(roles);
authorities.addAll(rules);
}
User user = new User(users.getUsername(), users.getPassword(), AuthorityUtils.commaSeparatedStringToAuthorityList(String.join(",", authorities)));
return user;
}
}
其中关于用户信息获取的Service就不赘述了。
OursPasswordEncoder
自定义PasswordEncoder接口的实现类OursPasswordEncoder
主要是将登入表单的password通过OursPasswordEncoder进行同数据库中加密(encode)过的password进行比对处理matches方法,来判断密码有效性。
/**
* 编码器:自定义密码验证编码器
*/
@Component("oursPasswordEncoder")
public class OursPasswordEncoder implements PasswordEncoder {
/*public OursPasswordEncoder(){
System.out.println("密码编码器4:OursPasswordEncoder");
}*/
/**
* 加密
*
* @param charSequence
* @return
*/
@Override
public String encode(CharSequence charSequence) {
//System.out.println("密码编码器4.1");
//自定义盐
String authCode = null;
String AUTHCODE = "盐";//
if (!(authCode != null && authCode.length() != 0)) {
authCode = AUTHCODE;
}
//加密方式 简单MD5加密,可以用securit自带加密方式,更安全,此处是演示使用,自定义自己的加密方式
String password = (String) charSequence;
password = authCode + password;
password = DigestUtils.md5DigestAsHex(password.getBytes());
return password;
}
/**
* 加密对比
*
* @param charSequence
* @param s
* @return
*/
@Override
public boolean matches(CharSequence charSequence, String s) {
//System.out.println("密码编码器4.2");
//加密部分
String password = encode(charSequence);
//--
return s.equals(password);
}
}
配置
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(oursUserDetailsService).passwordEncoder(oursPasswordEncoder);
}
注意,application.yml中的
spring:
security:
user:
name: abc
password: 123
可以删除掉了。
启动运行,发现可以通过数据库中的用户来登录了!结束!