ruoyi-vue前后端分离版本增加登录接口并使用若依的验证方法
LoginController类
具体代码
/** * app 登录 */ @AnonymousAccess @PostMapping("login") public AjaxResult login(@RequestBody LoginBody loginBody) { AjaxResult ajax = AjaxResult.success(); // 生成令牌 String token = loginService.login(loginBody.getUsername(), loginBody.getPassword()); ajax.put(Constants.TOKEN, token); return ajax; }
登录校验 ——AppLoginService类
具体代码
@Resource
private AppAuthenticationProvider authenticationManager;
/** * 登录验证 * * @param username 用户名 * @param password 密码 * @return 结果 */ public String login(String username, String password) { // 用户验证 Authentication authentication; try { // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername authentication = authenticationManager .authenticate(new UsernamePasswordAuthenticationToken(username, password)); } catch (Exception e) { if (e instanceof BadCredentialsException) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); throw new UserPasswordNotMatchException(); } else { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); throw new ServiceException(e.getMessage()); } } AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); recordLoginInfo(loginUser.getUserId()); // 生成token return tokenService.createToken(loginUser); }
AppAuthenticationProvider 类

具体代码
@Component public class AppAuthenticationProvider implements AuthenticationProvider { @Autowired private AppUserDetailsServiceImpl userDetailsService; @SneakyThrows @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String userName = authentication.getName();// 这个获取表单输入中返回的用户名; // 这里构建来判断用户是否存在和密码是否正确 UserDetails userInfo = userDetailsService.loadUserByUsername(userName); // 这里调用我们的自己写的获取用户的方法; Collection<? extends GrantedAuthority> authorities = userInfo.getAuthorities(); // 构建返回的用户登录成功的token return new UsernamePasswordAuthenticationToken(userInfo, userInfo.getPassword(), authorities); } @Override public boolean supports(Class<?> authentication) { // return authentication.equals(UsernamePasswordAuthenticationToken.class); // 这里直接改成 return true;表示是支持这个执行 return true; } }
AppUserDetailsServiceImpl类

具体代码
@Service public class AppUserDetailsServiceImpl implements UserDetailsService { private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); @Autowired private IProductMemberService memberService;//自己写的接口 @Autowired private IProductMemberCourtService memberCourtService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { ProductMember member = memberService.selectUserByUserName(username);//验证登录用户 if (StringUtils.isNull(member)) { log.info("登录用户:{} 不存在.", username); throw new ServiceException("登录用户:" + username + " 不存在"); } else if (UserStatus.DELETED.getCode().equals(member.getDelFlag())) { log.info("登录用户:{} 已被删除.", username); throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); } else if (UserStatus.DISABLE.getCode().equals(member.getStatus())) { log.info("登录用户:{} 已被停用.", username); throw new ServiceException("对不起,您的账号:" + username + " 已停用"); } return createLoginUser(member); } public UserDetails createLoginUser(ProductMember member) { return new LoginUser(member.getMemberId(), memberCourtService.selectCourtIdByMemberId(member.getMemberId()), member); } }
此时运行时,会有冲突!!!
需要在 xxx-framework/src/main/java/....../SecurityConfig中条件
@Qualifier("userDetailsServiceImpl")
如图:
此时启动项目不会报冲突的错
千万千万要添加!!!
下图中的LongUser类要添加东西
要在public String getPassword(){}中添加自己写的登录实体类的getPassword()