package com.nanyin.services.impl;
import com.google.common.base.Strings;
import com.nanyin.config.exceptions.userException.UserExistedException;
import com.nanyin.config.security.CustomAuthenticatioToken;
import com.nanyin.services.RedisService;
import com.nanyin.config.util.*;
import com.nanyin.entity.*;
import com.nanyin.repository.SexRepository;
import com.nanyin.repository.StatusRepository;
import com.nanyin.repository.UserRepository;
import com.nanyin.config.util.SecurityUtils;
import com.nanyin.services.UserServices;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.Predicate;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.*;
import org.springframework.context.MessageSource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
@Service
@CacheConfig(cacheManager = "TtlCacheManager")
public class UserServicesImpl implements UserServices,UserDetailsService {
@Value("${hash.algorithm.md5}")
private String algorithm;
@Value("${hash.algorithm.iterations}")
private int iterations;
@Value("${hash.algorithm.defalutCrdentials}")
private String defalutCrdentials;
private Logger logger = LoggerFactory.getLogger(this.getClass().getName());
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
UserRepository userRepository;
@Autowired
MessageSource messageSource;
@Autowired
RedisService redisService;
@Autowired
SexRepository sexRepository;
@Autowired
StatusRepository statusRepository;
@Autowired
JPAQueryFactory jpaQueryFactory;
/**
* 继承自UserDetailsService,进行权限角色验证和Authorities的添加
* @param username
* @return
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findUserByName(username);
if (user == null) {
throw new UsernameNotFoundException("该用户不存在");
}
Set<Role> roles = user.getRoles();
Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
// 系统层面只根据权限限制方法是否可执行
for (Role role : roles) {
grantedAuthorities.addAll(role.getPermissions()
.stream()
.map(permission -> new SimpleGrantedAuthority(permission.getName()))
.collect(Collectors.toList()));
}
return new org.springframework.security.core.userdetails.User(username,user.getPassword(),grantedAuthorities);
}
@Override
// @Cacheable(value = "user", key = "#name")
public User getUserFromUserName(String name) {
return userRepository.findUserByName(name);
}
/**
* 复杂条件的JPA 查询语句,需要 实现JpaSpecificationExecutor接口
* @param offset
* @param limit
* @param order
* @param search
* @param status
* @param sex
* @return
* @throws Exception
*/
@Override
public Page<User> findUsers(Integer offset, Integer limit, String order, String search, Integer status, Integer sex, Integer role) throws Exception {
Sort sort = null;
String propertie = order.substring(1);
if (order.startsWith("-")) {
sort = Sort.by(propertie).descending();
} else if (order.startsWith("+")) {
sort = Sort.by(propertie).ascending();
}
PageRequest pageRequest = PageHelper.generatePageRequest(offset, limit, sort);
QUser user = QUser.user;
com.querydsl.core.types.Predicate predicate = user.isNotNull().or(user.isNull());
predicate = search == null ? predicate : ExpressionUtils.and(predicate, user.name.like("%" + search + "%"));
predicate = sex == null ? predicate : ExpressionUtils.and(predicate, user.sex.id.eq(sex));
predicate = status == null ? predicate : ExpressionUtils.and(predicate, user.status.id.eq(status));
predicate = role == null ? predicate : ExpressionUtils.and(predicate, user.roles.any().id.eq(role));
return userRepository.findAll(predicate, pageRequest);
}
/**
* 登陆方法,使用shiro进行登陆的验证,随机生成token,放到cookie中(可不用),前端每次发送请求都在header中
* 添加 X—Token 属性,后端每次拦截请求都要从属性中获取token在redis中是否存在,如果存在,延长redis中的ttl时间
* @param username
* @param password
* @param rememberMe
* @return
* @throws IncorrectCredentialsException
*/
@Override
public String login(String username, String password, Boolean rememberMe) throws Exception{
MDCUtil.setUser(username);
CustomAuthenticatioToken token = SecurityUtils.login(HttpUtils.getHttpServletRequest(), username, password, authenticationManager);
return token.getToken();
}
@Override
public User getCurrentUserInfo(String token) throws Exception{
return userRepository.findUserByName(JwtUtil.getUsernameFromToken(token));
}
@Override
public List<Sex> getStandardSex() throws Exception {
return sexRepository.findAll();
}
@Override
public List<Status> getStandardStatus() throws Exception {
return statusRepository.findAll();
}
@Override
public String logout(String token) throws Exception {
if(redisService.exists(token)){
// 删除缓存中的token
redisService.remove(token);
return token;
}
return null;
}
@Override
public User saveUser(User user) throws Exception {
// 先查看用户名在系统中是否存在,如果存在,返回错误
if(!Strings.isNullOrEmpty(user.getName())){
User userByName = userRepository.findUserByName(user.getName());
if(userByName!=null){
throw new UserExistedException();
}
}
user = initUser(user);
// 创建用户
return userRepository.saveAndFlush(user);
}
@Override
public User updateUser(User user) throws Exception {
Integer userId = user.getId();
if(userId!=null){
if(!Strings.isNullOrEmpty(user.getName())){
User userByName = userRepository.findUserByName(user.getName());
if(userByName!=null && userByName.getId()!=userId){
throw new UserExistedException();
}
}
}
// 设置更新时间
user.setGmtModify(new Date());
// 单独更新密码
user.setPassword(generatePassword(user.getPassword(),user.getSalt()));
return userRepository.saveAndFlush(user);
}
@Override
public void deleteUser(Integer id) throws Exception {
userRepository.deleteById(id);
}
@Override
public User findUserByName(String name) {
// 精确查找名称,存在多个,或不存在返回null
return userRepository.findUserByName(name);
}
@Override
没有合适的资源?快使用搜索试试~ 我知道了~
java基于Spring全家桶的简单的后台管理系统.rar
共279个文件
java:109个
xml:69个
png:62个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 165 浏览量
2024-02-21
15:06:34
上传
评论
收藏 1.93MB RAR 举报
温馨提示
java源码 仅供学习和参考,禁止一切商业行为
资源推荐
资源详情
资源评论
收起资源包目录
java基于Spring全家桶的简单的后台管理系统.rar (279个子文件)
navbar.css 3KB
project.css 2KB
sidebar.css 998B
signin.css 767B
error.css 667B
index.css 100B
users.html 11KB
userInfo.html 9KB
index.html 7KB
navbar.html 3KB
signin.html 2KB
402.html 2KB
404.html 2KB
401.html 1KB
sidebar.html 786B
5xx.html 143B
web-ssm-project.iml 18KB
UserServicesImpl.java 10KB
JobService.java 10KB
JwtUtil.java 7KB
CustomWebSecurityConfiguration.java 7KB
ShiroWebConfiguration.java 6KB
LogAdvice.java 6KB
test1.java 5KB
RoleServiceImpl.java 5KB
DefaultJob.java 5KB
RedisService.java 5KB
SecurityUtils.java 4KB
CustomAuthenticationFilter.java 3KB
HttpUtils.java 3KB
ControllerExceptionHandler.java 3KB
UserController.java 3KB
WebQuartzConfigure.java 3KB
ShiroWebRealm.java 3KB
WebRedisConfiguration.java 3KB
User.java 3KB
WebMvcConfiguration.java 3KB
RoleController.java 3KB
WebTokenInterceptor.java 3KB
PermissionServiceImpl.java 3KB
PageHelper.java 2KB
Swagger2Config.java 2KB
JobController.java 2KB
UserServicesImplTest.java 2KB
CommonUtils.java 2KB
UnitController.java 2KB
UploadService.java 2KB
FieldValidExceptionHandler.java 2KB
FastJson2JsonRedisSerializer.java 2KB
UserControllerTest.java 2KB
WebProjectApplicationTest.java 2KB
CustomPermissionEvaluator.java 2KB
UnitServiceImpl.java 2KB
MDCUtil.java 2KB
CustomLogoutFilter.java 2KB
LoginController.java 2KB
Role.java 2KB
CustomAuthenticationProvider.java 1KB
Result.java 1KB
Person.java 1KB
Unit.java 1KB
CustomLogoutSuccessHandler.java 1KB
UserServices.java 1KB
MyLocaleResolver.java 1KB
Permission.java 1KB
MySessionManager.java 1KB
HashHelper.java 1KB
Paper.java 1KB
Tickets.java 1KB
Operate.java 1KB
CORSFilter.java 1KB
ShiroAuthorizationExceptionHandler.java 1KB
JobEntity.java 1KB
CustomAuthenticatioToken.java 1KB
CustomAuthenticationEntryPoint.java 996B
CustomAccessDeniedHandler.java 989B
UserRepository.java 938B
ResultCodeEnum.java 912B
MyPassThruAuthenticationFilter.java 907B
Task.java 851B
Log.java 845B
MyCookieResolver.java 838B
RoleService.java 812B
LocaleService.java 812B
Sex.java 798B
PermissionController.java 780B
Status.java 779B
HandleStatus.java 733B
WebProjectApplication.java 656B
Priority.java 648B
UnitService.java 538B
PermissionRepository.java 527B
RoleRepository.java 519B
OperateServiceImpl.java 508B
ResultMapEnum.java 494B
SimpleJob.java 467B
SystemStatusEnum.java 427B
NameAndPw.java 425B
UnitRepository.java 424B
PermissionService.java 417B
共 279 条
- 1
- 2
- 3
资源评论
GeekyGuru
- 粉丝: 1616
- 资源: 1099
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 四数之和(java代码).docx
- 701837906919458TapScanner v3.0.10 (Pro).apk
- 青岛大学人工智能实验二 利用α-β搜索的博弈树算法编写一字棋游戏
- ### 1、项目介绍 本项目Scrapy进行数据爬取,并使用Django框架+PyEcharts实现可视化大屏 效果如下:
- # 微信小程序-健康菜谱 基于微信小程序的一个查找检索菜谱的应用 ### 效果 !动态图(./res/gif/demo
- zabbix-get命令包资源
- 289ssm-mysql-jsp 计算机课程实验管理系统.zip(可运行源码+数据库文件+文档)
- 毕业设计,基于PyQt5实现的可视化界面的Python车牌自动识别系统源码
- 20-天天果园项目.rar
- 26-朴素贝叶斯分类.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功