- LoginUser 类: 继承 UserDetails , 建立属性:
private String type;
private CCompanyUserDto cCompanyUserDto;
// 重写 LoginUser 函数
@Override
public String getPassword() {
if (user != null) {
return user.getPassword();
} else if (cCompanyUserDto != null) {
return cCompanyUserDto.getPassword();
}
return null;
}
@Override
public String getUsername() {
if (user != null) {
return user.getUserName();
} else if (cCompanyUserDto != null) {
return cCompanyUserDto.getUsername();
}
return null;
}
2.LoginBody 加字段
//类型:cp or company
private String type;
3.SysLoginService.login(加String type参数)
new UsernamePasswordAuthenticationToken(username + "@@@" + type, password)
4.SysUserMapper 类与 xml写:
public CompAdminDto selectCompAdmin(String username);
<!-- 其实不符合规范,为了统一登录代码写这里 -->
<select id="selectCompAdmin" parameterType="String" resultType="com.ruoyi.common.core.domain.entity.CompAdminDto">
SELECT * from comp_admin t where t.USERNAME= #{username}
</select>
5.UserDetailsServiceImpl.loadUserByUsername 修改:
String[] unames = username.split("@@@");
username = unames[0];
String type = unames[1];
// 企业登录
if ("company".equals(type)) {
CompAdminDto adminDto = userMapper.selectCompAdmin(username);
if (adminDto != null) {
return createLoginUser(adminDto);
}
throw new UsernameNotFoundException("登录用户:" + username + " 不存在");
}
UserDetailsServiceImpl新建函数:
public UserDetails createLoginUser(CompAdminDto adminDto) {
LoginUser loginUser = new LoginUser();
loginUser.setType("company");
loginUser.setAdminDto(adminDto);
return loginUser;
}
该博客介绍了如何通过LoginUser类实现UserDetails的扩展,处理不同类型的用户登录,包括普通用户和企业用户。在LoginUser中,重写了获取用户名和密码的方法,根据user或cCompanyUserDto对象返回相应信息。新增了LoginBody的type字段,SysLoginService.login方法接收type参数,使用UsernamePasswordAuthenticationToken进行身份验证。同时,更新了SysUserMapper的接口和XML配置,以查询企业用户。在UserDetailsServiceImpl中,根据type字段判断登录类型,对用户进行验证并创建LoginUser对象。这个过程优化了登录流程,实现了统一的登录入口。
3197

被折叠的 条评论
为什么被折叠?



