1. 程式人生 > 其它 >ruoyi-vue前後端分離版本增加登入介面並使用若依的驗證方法

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")

如圖:

 此時啟動專案不會報衝突的錯