ruoyi-vue前後端分離版本增加登入介面並使用若依的驗證方法
阿新 • • 發佈:2022-06-06
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")
如圖:
此時啟動專案不會報衝突的錯