parent
bb90b69df0
commit
fd91bd15ca
@ -1,19 +1,97 @@ |
|||||||
package net.lensfrex.dscape.auth; |
package net.lensfrex.dscape.auth; |
||||||
|
|
||||||
import cn.dev33.satoken.stp.StpInterface; |
import cn.dev33.satoken.stp.StpInterface; |
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import net.lensfrex.dscape.dao.entity.RolePermission; |
||||||
|
import net.lensfrex.dscape.dao.entity.UserRole; |
||||||
|
import net.lensfrex.dscape.dao.service.RolePermissionService; |
||||||
|
import net.lensfrex.dscape.dao.service.UserRoleService; |
||||||
|
import net.lensfrex.dscape.dao.service.impl.UserRoleServiceImpl; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||||
import org.springframework.stereotype.Component; |
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
||||||
|
|
||||||
|
@Slf4j |
||||||
@Component |
@Component |
||||||
public class StpInterfaceImpl implements StpInterface { |
public class StpInterfaceImpl implements StpInterface { |
||||||
|
|
||||||
|
private final UserRoleService userRoleService; |
||||||
|
private final RolePermissionService rolePermissionService; |
||||||
|
|
||||||
|
private final RedisTemplate<String, String> redis; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
public StpInterfaceImpl(RedisTemplate<String, String> redis, |
||||||
|
UserRoleService userRoleService, |
||||||
|
RolePermissionService rolePermissionService) { |
||||||
|
|
||||||
|
this.userRoleService = userRoleService; |
||||||
|
this.rolePermissionService = rolePermissionService; |
||||||
|
this.redis = redis; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
@Override |
@Override |
||||||
public List<String> getPermissionList(Object loginId, String loginType) { |
public List<String> getPermissionList(Object loginId, String loginType) { |
||||||
return null; |
String uid = (String) loginId; |
||||||
|
|
||||||
|
List<String> userRoles = this.getRoleList(loginId, loginType); |
||||||
|
List<String> rolePermissions = new ArrayList<>(); |
||||||
|
|
||||||
|
for (String role : userRoles) { |
||||||
|
String redisRolePermissionKey = "dscape:auth:role.permission:" + role; |
||||||
|
|
||||||
|
if (Boolean.FALSE.equals(redis.hasKey(redisRolePermissionKey))) { |
||||||
|
log.debug("角色 " + uid + " 的权限信息缓存不存在,从数据库中查找并放入缓存"); |
||||||
|
|
||||||
|
rolePermissions.addAll(rolePermissionService.getPermissions(role)); |
||||||
|
if (rolePermissions.isEmpty()) { |
||||||
|
return rolePermissions; |
||||||
|
} |
||||||
|
|
||||||
|
redis.opsForList().leftPushAll(redisRolePermissionKey, rolePermissions); |
||||||
|
} else { |
||||||
|
List<String> cachedUserRole = redis.opsForList().range(redisRolePermissionKey, 0, -1); |
||||||
|
if (cachedUserRole == null) { |
||||||
|
return rolePermissions; |
||||||
|
} |
||||||
|
|
||||||
|
rolePermissions.addAll(cachedUserRole); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return rolePermissions; |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public List<String> getRoleList(Object loginId, String loginType) { |
public List<String> getRoleList(Object loginId, String loginType) { |
||||||
return null; |
String uid = (String) loginId; |
||||||
|
String redisUserRoleKey = "dscape:auth:user.role:" + uid; |
||||||
|
|
||||||
|
List<String> userRoleList = new ArrayList<>(2); |
||||||
|
if (Boolean.FALSE.equals(redis.hasKey(redisUserRoleKey))) { |
||||||
|
log.debug("用户 " + uid + " 的角色信息缓存不存在,从数据库中查找并放入缓存"); |
||||||
|
|
||||||
|
userRoleList.addAll(userRoleService.getRoles(uid)); |
||||||
|
|
||||||
|
if (userRoleList.isEmpty()) { |
||||||
|
return userRoleList; |
||||||
|
} |
||||||
|
|
||||||
|
redis.opsForList().leftPushAll(redisUserRoleKey, userRoleList); |
||||||
|
} else { |
||||||
|
List<String> cachedUserRole = redis.opsForList().range(redisUserRoleKey, 0, -1); |
||||||
|
if (cachedUserRole == null) { |
||||||
|
return userRoleList; |
||||||
|
} |
||||||
|
|
||||||
|
userRoleList.addAll(cachedUserRole); |
||||||
|
} |
||||||
|
|
||||||
|
return userRoleList; |
||||||
} |
} |
||||||
} |
} |
@ -0,0 +1,52 @@ |
|||||||
|
package net.lensfrex.dscape.dao.entity; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.io.Serializable; |
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
|
||||||
|
/** |
||||||
|
* @description role_permission |
||||||
|
* @author lensfrex |
||||||
|
* @date 2022-08-17 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class RolePermission implements Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
@TableId(type = IdType.AUTO) |
||||||
|
/** |
||||||
|
* id |
||||||
|
*/ |
||||||
|
private Long id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 角色id |
||||||
|
*/ |
||||||
|
private Integer role; |
||||||
|
|
||||||
|
/** |
||||||
|
* 权限id |
||||||
|
*/ |
||||||
|
private Integer permission; |
||||||
|
|
||||||
|
/** |
||||||
|
* create_time |
||||||
|
*/ |
||||||
|
private LocalDateTime createTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* edit_time |
||||||
|
*/ |
||||||
|
private LocalDateTime editTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* is_deleted |
||||||
|
*/ |
||||||
|
private int isDeleted; |
||||||
|
|
||||||
|
public RolePermission() {} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package net.lensfrex.dscape.dao.entity; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
|
||||||
|
/** |
||||||
|
* @description user_role |
||||||
|
* @author lensfrex |
||||||
|
* @date 2022-08-17 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class UserRole implements Serializable { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
/** |
||||||
|
* id |
||||||
|
*/ |
||||||
|
@TableId(type = IdType.AUTO) |
||||||
|
private Long id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 角色id |
||||||
|
*/ |
||||||
|
private Integer role; |
||||||
|
|
||||||
|
/** |
||||||
|
* 用户uid |
||||||
|
*/ |
||||||
|
private String uid; |
||||||
|
|
||||||
|
/** |
||||||
|
* create_time |
||||||
|
*/ |
||||||
|
private LocalDateTime createTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* edit_time |
||||||
|
*/ |
||||||
|
private LocalDateTime editTime; |
||||||
|
|
||||||
|
/** |
||||||
|
* is_deleted |
||||||
|
*/ |
||||||
|
private int isDeleted; |
||||||
|
|
||||||
|
public UserRole() {} |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package net.lensfrex.dscape.dao.mapper; |
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
import org.apache.ibatis.annotations.Select; |
||||||
|
import net.lensfrex.dscape.dao.entity.RolePermission; |
||||||
|
import java.util.List; |
||||||
|
/** |
||||||
|
* @description role_permissionMapper |
||||||
|
* @author lensfrex |
||||||
|
* @date 2022-08-17 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface RolePermissionMapper extends BaseMapper<RolePermission> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package net.lensfrex.dscape.dao.mapper; |
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
import org.apache.ibatis.annotations.Select; |
||||||
|
import net.lensfrex.dscape.dao.entity.UserRole; |
||||||
|
import java.util.List; |
||||||
|
/** |
||||||
|
* @description user_roleMapper |
||||||
|
* @author lensfrex |
||||||
|
* @date 2022-08-17 |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface UserRoleMapper extends BaseMapper<UserRole> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package net.lensfrex.dscape.dao.service; |
||||||
|
import net.lensfrex.dscape.dao.entity.RolePermission; |
||||||
|
import org.apache.ibatis.annotations.Select; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import com.baomidou.mybatisplus.extension.service.IService; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @description role_permission服务层 |
||||||
|
* @author lensfrex |
||||||
|
* @date 2022-08-17 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
public interface RolePermissionService extends IService<RolePermission> { |
||||||
|
@Select("select permission from role_permission where role = #{role} and is_deleted = 0") |
||||||
|
List<String> getPermissions(String role); |
||||||
|
|
||||||
|
@Select("select permission from role_permission where role = #{role} and is_deleted = 0") |
||||||
|
List<String> getPermissions(List<String> roles); |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package net.lensfrex.dscape.dao.service; |
||||||
|
import net.lensfrex.dscape.dao.entity.UserRole; |
||||||
|
import org.apache.ibatis.annotations.Select; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import com.baomidou.mybatisplus.extension.service.IService; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @description user_role服务层 |
||||||
|
* @author lensfrex |
||||||
|
* @date 2022-08-17 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
public interface UserRoleService extends IService<UserRole> { |
||||||
|
|
||||||
|
@Select("select role from user_role where uid = '#{uid}' and is_deleted != 1") |
||||||
|
List<String> getRoles(String uid); |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
/* |
||||||
|
* Class created by lensfrex. |
||||||
|
*/ |
||||||
|
|
||||||
|
package net.lensfrex.dscape.dao.service.impl; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||||
|
import com.baomidou.mybatisplus.extension.service.IService; |
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||||
|
import net.lensfrex.dscape.dao.entity.RolePermission; |
||||||
|
import net.lensfrex.dscape.dao.mapper.RolePermissionMapper; |
||||||
|
import net.lensfrex.dscape.dao.service.RolePermissionService; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Service |
||||||
|
public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper, RolePermission> implements RolePermissionService { |
||||||
|
@Override |
||||||
|
public List<String> getPermissions(String role) { |
||||||
|
QueryWrapper<RolePermission> wrapper = new QueryWrapper<>(); |
||||||
|
wrapper.lambda() |
||||||
|
.select(RolePermission::getPermission) |
||||||
|
.eq(RolePermission::getRole, role) |
||||||
|
.eq(RolePermission::getIsDeleted, 0); |
||||||
|
|
||||||
|
return this.getPermissions(wrapper); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<String> getPermissions(List<String> roles) { |
||||||
|
QueryWrapper<RolePermission> wrapper = new QueryWrapper<>(); |
||||||
|
wrapper.lambda() |
||||||
|
.select(RolePermission::getPermission) |
||||||
|
.in(RolePermission::getRole, roles) |
||||||
|
.eq(RolePermission::getIsDeleted, 0); |
||||||
|
|
||||||
|
return this.getPermissions(wrapper); |
||||||
|
} |
||||||
|
|
||||||
|
private List<String> getPermissions(QueryWrapper<RolePermission> wrapper) { |
||||||
|
|
||||||
|
List<RolePermission> rolePermissionList = this.list(wrapper); |
||||||
|
|
||||||
|
List<String > permissions = new ArrayList<>(); |
||||||
|
rolePermissionList.forEach(rolePermission -> permissions.add(rolePermission.getPermission().toString())); |
||||||
|
|
||||||
|
return permissions; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
/* |
||||||
|
* Class created by lensfrex. |
||||||
|
*/ |
||||||
|
|
||||||
|
package net.lensfrex.dscape.dao.service.impl; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||||
|
import com.baomidou.mybatisplus.extension.service.IService; |
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||||
|
import net.lensfrex.dscape.dao.entity.UserRole; |
||||||
|
import net.lensfrex.dscape.dao.mapper.UserRoleMapper; |
||||||
|
import net.lensfrex.dscape.dao.service.UserRoleService; |
||||||
|
import org.apache.ibatis.annotations.Select; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Service |
||||||
|
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole> implements UserRoleService { |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<String> getRoles(String uid) { |
||||||
|
QueryWrapper<UserRole> wrapper = new QueryWrapper<>(); |
||||||
|
wrapper.lambda() |
||||||
|
.select(UserRole::getRole) |
||||||
|
.eq(UserRole::getUid, uid) |
||||||
|
.eq(UserRole::getIsDeleted, 0); |
||||||
|
|
||||||
|
List<UserRole> userRoleList = this.list(wrapper); |
||||||
|
List<String> roles = new ArrayList<>(); |
||||||
|
|
||||||
|
userRoleList.forEach(userRole -> roles.add(userRole.getRole().toString())); |
||||||
|
|
||||||
|
return roles; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
|
||||||
|
package net.lensfrex.dscape.dto.request; |
||||||
|
|
||||||
|
import javax.annotation.Generated; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class UserLoginRequestBody { |
||||||
|
private String password; |
||||||
|
|
||||||
|
@JsonProperty("user_name") |
||||||
|
private String userName; |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
/* |
||||||
|
* Class created by lensfrex. |
||||||
|
*/ |
||||||
|
|
||||||
|
package net.lensfrex.dscape.web.service.user; |
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.SaTokenInfo; |
||||||
|
import cn.dev33.satoken.stp.StpUtil; |
||||||
|
import net.lensfrex.dscape.dto.request.UserLoginRequestBody; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
@Service |
||||||
|
public class UserService { |
||||||
|
public SaTokenInfo login(UserLoginRequestBody requestBody) { |
||||||
|
StpUtil.login(requestBody.getUserName()); |
||||||
|
return StpUtil.getTokenInfo(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
/* |
||||||
|
* Class created by lensfrex. |
||||||
|
*/ |
||||||
|
|
||||||
|
package net.lensfrex.dscape.test; |
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
import org.springframework.boot.test.context.SpringBootTest; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@SpringBootTest |
||||||
|
public class TestMain { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testPermission() { |
||||||
|
StpUtil.getPermissionList("114514asdf").forEach(System.out::println); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue