security+jwt+redis
1,service
1,1,DynamicSecurityService
package com.macro.mall.security.component;
import org.springframework.security.access.ConfigAttribute;
import java.util.Map;
/**
* 动态权限相关业务类
* Created by macro on 2020/2/7.
*/
public interface DynamicSecurityService {
/**
* 加载资源ANT通配符和资源对应MAP
*/
Map<String, ConfigAttribute> loadDataSource();
}
1.2,RedisService
package com.macro.mall.common.service;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* redis操作Service
* Created by macro on 2020/3/3.
*/
public interface RedisService {
/**
* 保存属性
*/
void set(String key, Object value, long time);
/**
* 保存属性
*/
void set(String key, Object value);
/**
* 获取属性
*/
Object get(String key);
/**
* 删除属性
*/
Boolean del(String key);
/**
* 批量删除属性
*/
Long del(List<String> keys);
/**
* 设置过期时间
*/
Boolean expire(String key, long time);
/**
* 获取过期时间
*/
Long getExpire(String key);
/**
* 判断是否有该属性
*/
Boolean hasKey(String key);
/**
* 按delta递增
*/
Long incr(String key, long delta);
/**
* 按delta递减
*/
Long decr(String key, long delta);
/**
* 获取Hash结构中的属性
*/
Object hGet(String key, String hashKey);
/**
* 向Hash结构中放入一个属性
*/
Boolean hSet(String key, String hashKey, Object value, long time);
/**
* 向Hash结构中放入一个属性
*/
void hSet(String key, String hashKey, Object value);
/**
* 直接获取整个Hash结构
*/
Map<Object, Object> hGetAll(String key);
/**
* 直接设置整个Hash结构
*/
Boolean hSetAll(String key, Map<String, Object> map, long time);
/**
* 直接设置整个Hash结构
*/
void hSetAll(String key, Map<String, ?> map);
/**
* 删除Hash结构中的属性
*/
void hDel(String key, Object... hashKey);
/**
* 判断Hash结构中是否有该属性
*/
Boolean hHasKey(String key, String hashKey);
/**
* Hash结构中属性递增
*/
Long hIncr(String key, String hashKey, Long delta);
/**
* Hash结构中属性递减
*/
Long hDecr(String key, String hashKey, Long delta);
/**
* 获取Set结构
*/
Set<Object> sMembers(String key);
/**
* 向Set结构中添加属性
*/
Long sAdd(String key, Object... values);
/**
* 向Set结构中添加属性
*/
Long sAdd(String key, long time, Object... values);
/**
* 是否为Set中的属性
*/
Boolean sIsMember(String key, Object value);
/**
* 获取Set结构的长度
*/
Long sSize(String key);
/**
* 删除Set结构中的属性
*/
Long sRemove(String key, Object... values);
/**
* 获取List结构中的属性
*/
List<Object> lRange(String key, long start, long end);
/**
* 获取List结构的长度
*/
Long lSize(String key);
/**
* 根据索引获取List中的属性
*/
Object lIndex(String key, long index);
/**
* 向List结构中添加属性
*/
Long lPush(String key, Object value);
/**
* 向List结构中添加属性
*/
Long lPush(String key, Object value, long time);
/**
* 向List结构中批量添加属性
*/
Long lPushAll(String key, Object... values);
/**
* 向List结构中批量添加属性
*/
Long lPushAll(String key, Long time, Object... values);
/**
* 从List结构中移除属性
*/
Long lRemove(String key, long count, Object value);
}
1.3,UmsAdminCacheService
package com.macro.mall.service;
import com.macro.mall.model.UmsAdmin;
import com.macro.mall.model.UmsResource;
import java.util.List;
/**
* 后台用户缓存操作类
* Created by macro on 2020/3/13.
*/
public interface UmsAdminCacheService {
/**
* 删除后台用户缓存
*/
void delAdmin(Long adminId);
/**
* 删除后台用户资源列表缓存
*/
void delResourceList(Long adminId);
/**
* 当角色相关资源信息改变时删除相关后台用户缓存
*/
void delResourceListByRole(Long roleId);
/**
* 当角色相关资源信息改变时删除相关后台用户缓存
*/
void delResourceListByRoleIds(List<Long> roleIds);
/**
* 当资源信息改变时,删除资源项目后台用户缓存
*/
void delResourceListByResource(Long resourceId);
/**
* 获取缓存后台用户信息
*/
UmsAdmin getAdmin(String username);
/**
* 设置缓存后台用户信息
*/
void setAdmin(UmsAdmin admin);
/**
* 获取缓存后台用户资源列表
*/
List<UmsResource> getResourceList(Long adminId);
/**
* 设置后台后台用户资源列表
*/
void setResourceList(Long adminId, List<UmsResource> resourceList);
}
1.4,UmsAdminService
package com.macro.mall.service;
import com.macro.mall.dto.UmsAdminParam;
import com.macro.mall.dto.UpdateAdminPasswordParam;
import com.macro.mall.model.UmsAdmin;
import com.macro.mall.model.UmsResource;
import com.macro.mall.model.UmsRole;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 后台管理员Service
* Created by macro on 2018/4/26.
*/
public interface UmsAdminService {
/**
* 根据用户名获取后台管理员
*/
UmsAdmin getAdminByUsername(String username);
/**
* 注册功能
*/
UmsAdmin register(UmsAdminParam umsAdminParam);
/**
* 登录功能
* @param username 用户名
* @param password 密码
* @return 生成的JWT的token
*/
String login(String username, String password);
/**
* 刷新token的功能
* @param oldToken 旧的token
*/
String refreshToken(String oldToken);
/**
* 根据用户id获取用户
*/
UmsAdmin getItem(Long id);
/**
* 根据用户名或昵称分页查询用户
*/
List<UmsAdmin> list(String keyword, Integer pageSize, Integer pageNum);
/**
* 修改指定用户信息
*/
int update(Long id, UmsAdmin admin);
/**
* 删除指定用户
*/
int delete(Long id);
/**
* 修改用户角色关系
*/
@Transactional
int updateRole(Long adminId, List<Long> roleIds);
/**
* 获取用户对于角色
*/
List<UmsRole> getRoleList(Long adminId);
/**
* 获取指定用户的可访问资源
*/
List<UmsResource> getResourceList(Long adminId);
/**
* 修改密码
*/
int updatePassword(UpdateAdminPasswordParam updatePasswordParam);
/**
* 获取用户信息
*/
UserDetails loadUserByUsername(String username);
}
1.5,UmsResourceService
package com.macro.mall.service;
import com.macro.mall.model.UmsResource;
import java.util.List;
/**
* 后台资源管理Service
* Created by macro on 2020/2/2.
*/
public interface UmsResourceService {
/**
* 添加资源
*/
int create(UmsResource umsResource);
/**
* 修改资源
*/
int update(Long id, UmsResource umsResource);
/**
* 获取资源详情
*/
UmsResource getItem(Long id);
/**
* 删除资源
*/
int delete(Long id);
/**
* 分页查询资源
*/
List<UmsResource> list(Long categoryId, String nameKeyword, String urlKeyword, Integer pageSize, Integer pageNum);
/**
* 查询全部资源
*/
List<UmsResource> listAll();
}
1.6,UmsRoleService
package com.macro.mall.service;
import com.macro.mall.model.UmsMenu;
import com.macro.mall.model.UmsResource;
import com.macro.mall.model.UmsRole;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 后台角色管理Service
* Created by macro on 2018/9/30.
*/
public interface UmsRoleService {
/**
* 添加角色
*/
int create(UmsRole role);
/**
* 修改角色信息
*/
int update(Long id, UmsRole role);
/**
* 批量删除角色
*/
int delete(List<Long> ids);
/**
* 获取所有角色列表
*/
List<UmsRole> list();
/**
* 分页获取角色列表
*/
List<UmsRole> list(String keyword, Integer pageSize, Integer pageNum);
/**
* 根据管理员ID获取对应菜单
*/
List<UmsMenu> getMenuList(Long adminId);
/**
* 获取角色相关菜单
*/
List<UmsMenu> listMenu(Long roleId);
/**
* 获取角色相关资源
*/
List<UmsResource> listResource(Long roleId);
/**
* 给角色分配菜单
*/
@Transactional
int allocMenu(Long roleId, List<Long> menuIds);
/**
* 给角色分配资源
*/
@Transactional
int allocResource(Long roleId, List<Long> resourceIds);
}
2,serviceImpl
2.1,RedisServiceImpl
package com.macro.mall.common.service.impl;
import com.macro.mall.common.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* redis操作实现类
* Created by macro on 2020/3/3.
*/
public class RedisServiceImpl implements RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void set(String key, Object value, long time) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
}
@Override
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
@Override
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
@Override
public Boolean del(String key) {
return redisTemplate.delete(key);
}
@Override
public Long del(List<String> keys) {
return redisTemplate.delete(keys);
}
@Override
public Boolean expire(String key, long time) {
return redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
@Override
public Long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
@Override
public Boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
@Override
public Long incr(String key, long delta) {
return redisTemplate.opsForValue().increment(key, delta);
}
@Override
public Long decr(String key, long delta) {
return redisTemplate.opsForValue().increment(key, -delta);
}
@Override
public Object hGet(String key, String hashKey) {
return redisTemplate.opsForHash().get(key, hashKey);
}
@Override
public Boolean hSet(String key, String hashKey, Object value, long time) {
redisTemplate.opsForHash().put(key, hashKey, value);
return expire(key, time);
}
@Override
public void hSet(String key, String hashKey, Object value) {
redisTemplate.opsForHash().put(key, hashKey, value);
}
@Override
public Map<Object, Object> hGetAll(String key) {
return redisTemplate.opsForHash().entries(key);
}
@Override
public Boolean hSetAll(String key, Map<String, Object> map, long time) {
redisTemplate.opsForHash().putAll(key, map);
return expire(key, time);
}
@Override
public void hSetAll(String key, Map<String, ?> map) {
redisTemplate.opsForHash().putAll(key, map);
}
@Override
public void hDel(String key, Object... hashKey) {
redisTemplate.opsForHash().delete(key, hashKey);
}
@Override
public Boolean hHasKey(String key, String hashKey) {
return redisTemplate.opsForHash().hasKey(key, hashKey);
}
@Override
public Long hIncr(String key, String hashKey, Long delta) {
return redisTemplate.opsForHash().increment(key, hashKey, delta);
}
@Override
public Long hDecr(String key, String hashKey, Long delta) {
return redisTemplate.opsForHash().increment(key, hashKey, -delta);
}
@Override
public Set<Object> sMembers(String key) {
return redisTemplate.opsForSet().members(key);
}
@Override
public Long sAdd(String key, Object... values) {
return redisTemplate.opsForSet().add(key, values);
}
@Override
public Long sAdd(String key, long time, Object... values) {
Long count = redisTemplate.opsForSet().add(key, values);
expire(key, time);
return count;
}
@Override
public Boolean sIsMember(String key, Object value) {
return redisTemplate.opsForSet().isMember(key, value);
}
@Override
public Long sSize(String key) {
return redisTemplate.opsForSet().size(key);
}
@Override
public Long sRemove(String key, Object... values) {
return redisTemplate.opsForSet().remove(key, values);
}
@Override
public List<Object> lRange(String key, long start, long end) {
return redisTemplate.opsForList().range(key, start, end);
}
@Override
public Long lSize(String key) {
return redisTemplate.opsForList().size(key);
}
@Override
public Object lIndex(String key, long index) {
return redisTemplate.opsForList().index(key, index);
}
@Override
public Long lPush(String key, Object value) {
return redisTemplate.opsForList().rightPush(key, value);
}
@Override
public Long lPush(String key, Object value, long time) {
Long index = redisTemplate.opsForList().rightPush(key, value);
expire(key, time);
return index;
}
@Override
public Long lPushAll(String key, Object... values) {
return redisTemplate.opsForList().rightPushAll(key, values);
}
@Override
public Long lPushAll(String key, Long time, Object... values) {
Long count = redisTemplate.opsForList().rightPushAll(key, values);
expire(key, time);
return count;
}
@Override
public Long lRemove(String key, long count, Object value) {
return redisTemplate.opsForList().remove(key, count, value);
}
}
2.2,UmsAdminCacheServiceImpl
package com.macro.mall.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.macro.mall.common.service.RedisService;
import com.macro.mall.dao.UmsAdminRoleRelationDao;
import com.macro.mall.mapper.UmsAdminRoleRelationMapper;
import com.macro.mall.model.UmsAdmin;
import com.macro.mall.model.UmsAdminRoleRelation;
import com.macro.mall.model.UmsAdminRoleRelationExample;
import com.macro.mall.model.UmsResource;
import com.macro.mall.service.UmsAdminCacheService;
import com.macro.mall.service.UmsAdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* UmsAdminCacheService实现类
* Created by macro on 2020/3/13.
*/
@Service
public class UmsAdminCacheServiceImpl implements UmsAdminCacheService {
@Autowired
private UmsAdminService adminService;
@Autowired
private RedisService redisService;
@Autowired
private UmsAdminRoleRelationMapper adminRoleRelationMapper;
@Autowired
private UmsAdminRoleRelationDao adminRoleRelationDao;
@Value("${redis.database}")
private String REDIS_DATABASE;
@Value("${redis.expire.common}")
private Long REDIS_EXPIRE;
@Value("${redis.key.admin}")
private String REDIS_KEY_ADMIN;
@Value("${redis.key.resourceList}")
private String REDIS_KEY_RESOURCE_LIST;
@Override
public void delAdmin(Long adminId) {
UmsAdmin admin = adminService.getItem(adminId);
if (admin != null) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_ADMIN + ":" + admin.getUsername();
redisService.del(key);
}
}
@Override
public void delResourceList(Long adminId) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_RESOURCE_LIST + ":" + adminId;
redisService.del(key);
}
@Override
public void delResourceListByRole(Long roleId) {
UmsAdminRoleRelationExample example = new UmsAdminRoleRelationExample();
example.createCriteria().andRoleIdEqualTo(roleId);
List<UmsAdminRoleRelation> relationList = adminRoleRelationMapper.selectByExample(example);
if (CollUtil.isNotEmpty(relationList)) {
String keyPrefix = REDIS_DATABASE + ":" + REDIS_KEY_RESOURCE_LIST + ":";
List<String> keys = relationList.stream().map(relation -> keyPrefix + relation.getAdminId()).collect(Collectors.toList());
redisService.del(keys);
}
}
@Override
public void delResourceListByRoleIds(List<Long> roleIds) {
UmsAdminRoleRelationExample example = new UmsAdminRoleRelationExample();
example.createCriteria().andRoleIdIn(roleIds);
List<UmsAdminRoleRelation> relationList = adminRoleRelationMapper.selectByExample(example);
if (CollUtil.isNotEmpty(relationList)) {
String keyPrefix = REDIS_DATABASE + ":" + REDIS_KEY_RESOURCE_LIST + ":";
List<String> keys = relationList.stream().map(relation -> keyPrefix + relation.getAdminId()).collect(Collectors.toList());
redisService.del(keys);
}
}
@Override
public void delResourceListByResource(Long resourceId) {
List<Long> adminIdList = adminRoleRelationDao.getAdminIdList(resourceId);
if (CollUtil.isNotEmpty(adminIdList)) {
String keyPrefix = REDIS_DATABASE + ":" + REDIS_KEY_RESOURCE_LIST + ":";
List<String> keys = adminIdList.stream().map(adminId -> keyPrefix + adminId).collect(Collectors.toList());
redisService.del(keys);
}
}
@Override
public UmsAdmin getAdmin(String username) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_ADMIN + ":" + username;
return (UmsAdmin) redisService.get(key);
}
@Override
public void setAdmin(UmsAdmin admin) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_ADMIN + ":" + admin.getUsername();
redisService.set(key, admin, REDIS_EXPIRE);
}
@Override
public List<UmsResource> getResourceList(Long adminId) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_RESOURCE_LIST + ":" + adminId;
return (List<UmsResource>) redisService.get(key);
}
@Override
public void setResourceList(Long adminId, List<UmsResource> resourceList) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_RESOURCE_LIST + ":" + adminId;
redisService.set(key, resourceList, REDIS_EXPIRE);
}
}
2.3,UmsAdminServiceImpl
package com.macro.mall.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.macro.mall.bo.AdminUserDetails;
import com.macro.mall.common.exception.Asserts;
import com.macro.mall.dao.UmsAdminRoleRelationDao;
import com.macro.mall.dto.UmsAdminParam;
import com.macro.mall.dto.UpdateAdminPasswordParam;
import com.macro.mall.mapper.UmsAdminLoginLogMapper;
import com.macro.mall.mapper.UmsAdminMapper;
import com.macro.mall.mapper.UmsAdminRoleRelationMapper;
import com.macro.mall.model.*;
import com.macro.mall.security.util.JwtTokenUtil;
import com.macro.mall.service.UmsAdminCacheService;
import com.macro.mall.service.UmsAdminService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* UmsAdminService实现类
* Created by macro on 2018/4/26.
*/
@Service
public class UmsAdminServiceImpl implements UmsAdminService {
private static final Logger LOGGER = LoggerFactory.getLogger(UmsAdminServiceImpl.class);
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UmsAdminMapper adminMapper;
@Autowired
private UmsAdminRoleRelationMapper adminRoleRelationMapper;
@Autowired
private UmsAdminRoleRelationDao adminRoleRelationDao;
@Autowired
private UmsAdminLoginLogMapper loginLogMapper;
@Autowired
private UmsAdminCacheService adminCacheService;
@Override
public UmsAdmin getAdminByUsername(String username) {
UmsAdmin admin = adminCacheService.getAdmin(username);
if(admin!=null) return admin;
UmsAdminExample example = new UmsAdminExample();
example.createCriteria().andUsernameEqualTo(username);
List<UmsAdmin> adminList = adminMapper.selectByExample(example);
if (adminList != null && adminList.size() > 0) {
admin = adminList.get(0);
adminCacheService.setAdmin(admin);
return admin;
}
return null;
}
@Override
public UmsAdmin register(UmsAdminParam umsAdminParam) {
UmsAdmin umsAdmin = new UmsAdmin();
BeanUtils.copyProperties(umsAdminParam, umsAdmin);
umsAdmin.setCreateTime(new Date());
umsAdmin.setStatus(1);
//查询是否有相同用户名的用户
UmsAdminExample example = new UmsAdminExample();
example.createCriteria().andUsernameEqualTo(umsAdmin.getUsername());
List<UmsAdmin> umsAdminList = adminMapper.selectByExample(example);
if (umsAdminList.size() > 0) {
return null;
}
//将密码进行加密操作
String encodePassword = passwordEncoder.encode(umsAdmin.getPassword());
umsAdmin.setPassword(encodePassword);
adminMapper.insert(umsAdmin);
return umsAdmin;
}
@Override
public String login(String username, String password) {
String token = null;
//密码需要客户端加密后传递
try {
UserDetails userDetails = loadUserByUsername(username);
if(!passwordEncoder.matches(password,userDetails.getPassword())){
Asserts.fail("密码不正确");
}
if(!userDetails.isEnabled()){
Asserts.fail("帐号已被禁用");
}
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
token = jwtTokenUtil.generateToken(userDetails);
// updateLoginTimeByUsername(username);
insertLoginLog(username);
} catch (AuthenticationException e) {
LOGGER.warn("登录异常:{}", e.getMessage());
}
return token;
}
/**
* 添加登录记录
* @param username 用户名
*/
private void insertLoginLog(String username) {
UmsAdmin admin = getAdminByUsername(username);
if(admin==null) return;
UmsAdminLoginLog loginLog = new UmsAdminLoginLog();
loginLog.setAdminId(admin.getId());
loginLog.setCreateTime(new Date());
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
loginLog.setIp(request.getRemoteAddr());
loginLogMapper.insert(loginLog);
}
/**
* 根据用户名修改登录时间
*/
private void updateLoginTimeByUsername(String username) {
UmsAdmin record = new UmsAdmin();
record.setLoginTime(new Date());
UmsAdminExample example = new UmsAdminExample();
example.createCriteria().andUsernameEqualTo(username);
adminMapper.updateByExampleSelective(record, example);
}
@Override
public String refreshToken(String oldToken) {
return jwtTokenUtil.refreshHeadToken(oldToken);
}
@Override
public UmsAdmin getItem(Long id) {
return adminMapper.selectByPrimaryKey(id);
}
@Override
public List<UmsAdmin> list(String keyword, Integer pageSize, Integer pageNum) {
PageHelper.startPage(pageNum, pageSize);
UmsAdminExample example = new UmsAdminExample();
UmsAdminExample.Criteria criteria = example.createCriteria();
if (!StringUtils.isEmpty(keyword)) {
criteria.andUsernameLike("%" + keyword + "%");
example.or(example.createCriteria().andNickNameLike("%" + keyword + "%"));
}
return adminMapper.selectByExample(example);
}
@Override
public int update(Long id, UmsAdmin admin) {
admin.setId(id);
UmsAdmin rawAdmin = adminMapper.selectByPrimaryKey(id);
if(rawAdmin.getPassword().equals(admin.getPassword())){
//与原加密密码相同的不需要修改
admin.setPassword(null);
}else{
//与原加密密码不同的需要加密修改
if(StrUtil.isEmpty(admin.getPassword())){
admin.setPassword(null);
}else{
admin.setPassword(passwordEncoder.encode(admin.getPassword()));
}
}
int count = adminMapper.updateByPrimaryKeySelective(admin);
adminCacheService.delAdmin(id);
return count;
}
@Override
public int delete(Long id) {
adminCacheService.delAdmin(id);
int count = adminMapper.deleteByPrimaryKey(id);
adminCacheService.delResourceList(id);
return count;
}
@Override
public int updateRole(Long adminId, List<Long> roleIds) {
int count = roleIds == null ? 0 : roleIds.size();
//先删除原来的关系
UmsAdminRoleRelationExample adminRoleRelationExample = new UmsAdminRoleRelationExample();
adminRoleRelationExample.createCriteria().andAdminIdEqualTo(adminId);
adminRoleRelationMapper.deleteByExample(adminRoleRelationExample);
//建立新关系
if (!CollectionUtils.isEmpty(roleIds)) {
List<UmsAdminRoleRelation> list = new ArrayList<>();
for (Long roleId : roleIds) {
UmsAdminRoleRelation roleRelation = new UmsAdminRoleRelation();
roleRelation.setAdminId(adminId);
roleRelation.setRoleId(roleId);
list.add(roleRelation);
}
adminRoleRelationDao.insertList(list);
}
adminCacheService.delResourceList(adminId);
return count;
}
@Override
public List<UmsRole> getRoleList(Long adminId) {
return adminRoleRelationDao.getRoleList(adminId);
}
@Override
public List<UmsResource> getResourceList(Long adminId) {
List<UmsResource> resourceList = adminCacheService.getResourceList(adminId);
if(CollUtil.isNotEmpty(resourceList)){
return resourceList;
}
resourceList = adminRoleRelationDao.getResourceList(adminId);
if(CollUtil.isNotEmpty(resourceList)){
adminCacheService.setResourceList(adminId,resourceList);
}
return resourceList;
}
@Override
public int updatePassword(UpdateAdminPasswordParam param) {
if(StrUtil.isEmpty(param.getUsername())
||StrUtil.isEmpty(param.getOldPassword())
||StrUtil.isEmpty(param.getNewPassword())){
return -1;
}
UmsAdminExample example = new UmsAdminExample();
example.createCriteria().andUsernameEqualTo(param.getUsername());
List<UmsAdmin> adminList = adminMapper.selectByExample(example);
if(CollUtil.isEmpty(adminList)){
return -2;
}
UmsAdmin umsAdmin = adminList.get(0);
if(!passwordEncoder.matches(param.getOldPassword(),umsAdmin.getPassword())){
return -3;
}
umsAdmin.setPassword(passwordEncoder.encode(param.getNewPassword()));
adminMapper.updateByPrimaryKey(umsAdmin);
adminCacheService.delAdmin(umsAdmin.getId());
return 1;
}
@Override
public UserDetails loadUserByUsername(String username){
//获取用户信息
UmsAdmin admin = getAdminByUsername(username);
if (admin != null) {
List<UmsResource> resourceList = getResourceList(admin.getId());
return new AdminUserDetails(admin,resourceList);
}
throw new UsernameNotFoundException("用户名或密码错误");
}
}
2.4,UmsResourceServiceImpl
package com.macro.mall.service.impl;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.macro.mall.mapper.UmsResourceMapper;
import com.macro.mall.model.UmsResource;
import com.macro.mall.model.UmsResourceExample;
import com.macro.mall.service.UmsAdminCacheService;
import com.macro.mall.service.UmsResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 后台资源管理Service实现类
* Created by macro on 2020/2/2.
*/
@Service
public class UmsResourceServiceImpl implements UmsResourceService {
@Autowired
private UmsResourceMapper resourceMapper;
@Autowired
private UmsAdminCacheService adminCacheService;
@Override
public int create(UmsResource umsResource) {
umsResource.setCreateTime(new Date());
return resourceMapper.insert(umsResource);
}
@Override
public int update(Long id, UmsResource umsResource) {
umsResource.setId(id);
int count = resourceMapper.updateByPrimaryKeySelective(umsResource);
adminCacheService.delResourceListByResource(id);
return count;
}
@Override
public UmsResource getItem(Long id) {
return resourceMapper.selectByPrimaryKey(id);
}
@Override
public int delete(Long id) {
int count = resourceMapper.deleteByPrimaryKey(id);
adminCacheService.delResourceListByResource(id);
return count;
}
@Override
public List<UmsResource> list(Long categoryId, String nameKeyword, String urlKeyword, Integer pageSize, Integer pageNum) {
PageHelper.startPage(pageNum,pageSize);
UmsResourceExample example = new UmsResourceExample();
UmsResourceExample.Criteria criteria = example.createCriteria();
if(categoryId!=null){
criteria.andCategoryIdEqualTo(categoryId);
}
if(StrUtil.isNotEmpty(nameKeyword)){
criteria.andNameLike('%'+nameKeyword+'%');
}
if(StrUtil.isNotEmpty(urlKeyword)){
criteria.andUrlLike('%'+urlKeyword+'%');
}
return resourceMapper.selectByExample(example);
}
@Override
public List<UmsResource> listAll() {
return resourceMapper.selectByExample(new UmsResourceExample());
}
}
2.5,UmsRoleServiceImpl
package com.macro.mall.service.impl;
import com.github.pagehelper.PageHelper;
import com.macro.mall.dao.UmsRoleDao;
import com.macro.mall.mapper.UmsRoleMapper;
import com.macro.mall.mapper.UmsRoleMenuRelationMapper;
import com.macro.mall.mapper.UmsRoleResourceRelationMapper;
import com.macro.mall.model.*;
import com.macro.mall.service.UmsAdminCacheService;
import com.macro.mall.service.UmsRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
/**
* 后台角色管理Service实现类
* Created by macro on 2018/9/30.
*/
@Service
public class UmsRoleServiceImpl implements UmsRoleService {
@Autowired
private UmsRoleMapper roleMapper;
@Autowired
private UmsRoleMenuRelationMapper roleMenuRelationMapper;
@Autowired
private UmsRoleResourceRelationMapper roleResourceRelationMapper;
@Autowired
private UmsRoleDao roleDao;
@Autowired
private UmsAdminCacheService adminCacheService;
@Override
public int create(UmsRole role) {
role.setCreateTime(new Date());
role.setAdminCount(0);
role.setSort(0);
return roleMapper.insert(role);
}
@Override
public int update(Long id, UmsRole role) {
role.setId(id);
return roleMapper.updateByPrimaryKeySelective(role);
}
@Override
public int delete(List<Long> ids) {
UmsRoleExample example = new UmsRoleExample();
example.createCriteria().andIdIn(ids);
int count = roleMapper.deleteByExample(example);
adminCacheService.delResourceListByRoleIds(ids);
return count;
}
@Override
public List<UmsRole> list() {
return roleMapper.selectByExample(new UmsRoleExample());
}
@Override
public List<UmsRole> list(String keyword, Integer pageSize, Integer pageNum) {
PageHelper.startPage(pageNum, pageSize);
UmsRoleExample example = new UmsRoleExample();
if (!StringUtils.isEmpty(keyword)) {
example.createCriteria().andNameLike("%" + keyword + "%");
}
return roleMapper.selectByExample(example);
}
@Override
public List<UmsMenu> getMenuList(Long adminId) {
return roleDao.getMenuList(adminId);
}
@Override
public List<UmsMenu> listMenu(Long roleId) {
return roleDao.getMenuListByRoleId(roleId);
}
@Override
public List<UmsResource> listResource(Long roleId) {
return roleDao.getResourceListByRoleId(roleId);
}
@Override
public int allocMenu(Long roleId, List<Long> menuIds) {
//先删除原有关系
UmsRoleMenuRelationExample example=new UmsRoleMenuRelationExample();
example.createCriteria().andRoleIdEqualTo(roleId);
roleMenuRelationMapper.deleteByExample(example);
//批量插入新关系
for (Long menuId : menuIds) {
UmsRoleMenuRelation relation = new UmsRoleMenuRelation();
relation.setRoleId(roleId);
relation.setMenuId(menuId);
roleMenuRelationMapper.insert(relation);
}
return menuIds.size();
}
@Override
public int allocResource(Long roleId, List<Long> resourceIds) {
//先删除原有关系
UmsRoleResourceRelationExample example=new UmsRoleResourceRelationExample();
example.createCriteria().andRoleIdEqualTo(roleId);
roleResourceRelationMapper.deleteByExample(example);
//批量插入新关系
for (Long resourceId : resourceIds) {
UmsRoleResourceRelation relation = new UmsRoleResourceRelation();
relation.setRoleId(roleId);
relation.setResourceId(resourceId);
roleResourceRelationMapper.insert(relation);
}
adminCacheService.delResourceListByRole(roleId);
return resourceIds.size();
}
}
我没写上去的。就是之前逆向工程生成的。详情请看我另一篇博客
逆向工程生成