package com.leigq.www.shiro.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.leigq.www.shiro.bean.CacheUser; import com.leigq.www.shiro.domain.entity.User; import com.leigq.www.shiro.domain.mapper.UserMapper; import com.leigq.www.shiro.service.IUserService; import com.leigq.www.shiro.web.exception.LoginException; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.List; /** * <p> * 服务实现类 * </p> * * @author leigq * @since 2019-06-28 */ @Service @Slf4j public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { @Override public User findByUsername(String username) { return baseMapper.selectOne( new LambdaQueryWrapper<User>().eq(User::getUserName, username) ); } @Override public CacheUser login(String userName, String password) { // 获取Subject实例对象,用户实例 Subject currentUser = SecurityUtils.getSubject(); // 将用户名和密码封装到UsernamePasswordToken UsernamePasswordToken token = new UsernamePasswordToken(userName, password); CacheUser cacheUser; // 4、认证 try { // 传到 MyShiroRealm 类中的方法进行认证 currentUser.login(token); // 构建缓存用户信息返回给前端 User user = (User) currentUser.getPrincipals().getPrimaryPrincipal(); cacheUser = CacheUser.builder() .token(currentUser.getSession().getId().toString()) .build(); BeanUtils.copyProperties(user, cacheUser); log.warn("CacheUser is {}", cacheUser.toString()); } catch (UnknownAccountException e) { log.error("账户不存在异常:", e); throw new LoginException("账号不存在!", e); } catch (IncorrectCredentialsException e) { log.error("凭据错误(密码错误)异常:", e); throw new LoginException("密码不正确!", e); } catch (AuthenticationException e) { log.error("身份验证异常:", e); throw new LoginException("用户验证失败!", e); } return cacheUser; } @Override public void logout() { Subject subject = SecurityUtils.getSubject(); subject.logout(); } @Override public List<User> listUsers() { return baseMapper.selectList(new LambdaQueryWrapper<>()); } }