mirror of https://gitee.com/stylefeng/roses
【7.0.2】登录模块放到system
parent
62b05e4835
commit
215ea52f8b
|
@ -43,6 +43,13 @@
|
||||||
<version>7.0.2</version>
|
<version>7.0.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--登录日志的业务-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.stylefeng.roses</groupId>
|
||||||
|
<artifactId>log-business-login-log</artifactId>
|
||||||
|
<version>7.0.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -48,4 +48,14 @@ public interface SystemConstants {
|
||||||
*/
|
*/
|
||||||
Long USER_CACHE_TIMEOUT_SECONDS = 3600L;
|
Long USER_CACHE_TIMEOUT_SECONDS = 3600L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 超级管理员的角色编码
|
||||||
|
*/
|
||||||
|
String SUPER_ADMIN_ROLE_CODE = "superAdmin";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化超级管理员的监听器顺序
|
||||||
|
*/
|
||||||
|
Integer SUPER_ADMIN_INIT_LISTENER_SORT = 400;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
package cn.stylefeng.roses.kernel.system.api.pojo.login;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.pojo.login.details.SimpleAuthDetail;
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.pojo.login.details.SimpleUserDetail;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登陆信息详情相应结果
|
||||||
|
*
|
||||||
|
* @author majianguo
|
||||||
|
* @date 2021/1/7 11:59
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class LoginDetailsResponse {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录人的token
|
||||||
|
*/
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 到期时间
|
||||||
|
*/
|
||||||
|
private Long expireAt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户基本信息
|
||||||
|
*/
|
||||||
|
private SimpleUserDetail user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限信息
|
||||||
|
*/
|
||||||
|
private List<SimpleAuthDetail> permissions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色信息
|
||||||
|
*/
|
||||||
|
private List<SimpleAuthDetail> roles;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录人的ws-url
|
||||||
|
*/
|
||||||
|
private String wsUrl;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package cn.stylefeng.roses.kernel.system.api.pojo.login.details;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 相关权限的数据,用在登录接口的返回详情
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/1/7 17:06
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class SimpleAuthDetail {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色的编码
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 具体的按钮
|
||||||
|
*/
|
||||||
|
private List<String> operation;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package cn.stylefeng.roses.kernel.system.api.pojo.login.details;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于登录返回详情
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/1/7 17:06
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class SimpleUserDetail {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户id
|
||||||
|
*/
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 姓名
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 头像
|
||||||
|
*/
|
||||||
|
private String avatar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 地址
|
||||||
|
*/
|
||||||
|
private String address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职位
|
||||||
|
*/
|
||||||
|
private String position;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
package cn.stylefeng.roses.kernel.system.modular.user.controller;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.AuthServiceApi;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
||||||
|
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
|
||||||
|
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
|
||||||
|
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
|
||||||
|
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
|
||||||
|
import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.pojo.login.LoginDetailsResponse;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.user.factory.LoginResponseFactory;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录登出控制器
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/3/17 17:23
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@Slf4j
|
||||||
|
@ApiResource(name = "登陆登出管理")
|
||||||
|
public class LoginController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AuthServiceApi authServiceApi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户登陆
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/3/17 17:23
|
||||||
|
*/
|
||||||
|
@PostResource(name = "登陆", path = "/login", requiredLogin = false, requiredPermission = false)
|
||||||
|
public ResponseData doAuth(@RequestBody @Validated LoginRequest loginRequest) {
|
||||||
|
LoginResponse loginResponse = authServiceApi.login(loginRequest);
|
||||||
|
return new SuccessResponseData(loginResponse.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户登出
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/3/17 17:24
|
||||||
|
*/
|
||||||
|
@GetResource(name = "登出", path = "/logout", requiredPermission = false)
|
||||||
|
public ResponseData logoutPage() {
|
||||||
|
authServiceApi.logout();
|
||||||
|
return new SuccessResponseData();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户登陆并返回详情
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/3/17 17:24
|
||||||
|
*/
|
||||||
|
@PostResource(name = "用户登陆并返回详情", path = "/loginWithDetail", requiredLogin = false, requiredPermission = false)
|
||||||
|
public ResponseData loginWithDetail(@RequestBody @Validated LoginRequest loginRequest) {
|
||||||
|
LoginResponse loginResponse = authServiceApi.login(loginRequest);
|
||||||
|
LoginDetailsResponse loginDetail = LoginResponseFactory.createLoginDetail(loginResponse);
|
||||||
|
return new SuccessResponseData(loginDetail);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前用户的用户信息
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/3/17 17:37
|
||||||
|
*/
|
||||||
|
@GetResource(name = "获取当前用户的用户信息", path = "/getCurrentLoginUserInfo", requiredPermission = false)
|
||||||
|
public ResponseData getCurrentLoginUserInfo() {
|
||||||
|
LoginUser loginUser = LoginContext.me().getLoginUser();
|
||||||
|
return new SuccessResponseData(loginUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package cn.stylefeng.roses.kernel.system.modular.user.factory;
|
||||||
|
|
||||||
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo;
|
||||||
|
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.pojo.login.LoginDetailsResponse;
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.pojo.login.details.SimpleAuthDetail;
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.pojo.login.details.SimpleUserDetail;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录返回结果组装
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/1/7 17:11
|
||||||
|
*/
|
||||||
|
public class LoginResponseFactory {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于登录接口的返回值创建
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2021/1/7 17:12
|
||||||
|
*/
|
||||||
|
public static LoginDetailsResponse createLoginDetail(LoginResponse loginResponse) {
|
||||||
|
|
||||||
|
SysUserService sysUserService = SpringUtil.getBean(SysUserService.class);
|
||||||
|
|
||||||
|
LoginDetailsResponse loginDetailsResponse = new LoginDetailsResponse();
|
||||||
|
|
||||||
|
// 获取用户详细信息
|
||||||
|
LoginUser loginUser = loginResponse.getLoginUser();
|
||||||
|
SimpleUserInfo simpleUserInfo = loginUser.getSimpleUserInfo();
|
||||||
|
|
||||||
|
// 获取用户角色信息
|
||||||
|
List<SimpleRoleInfo> simpleRoleInfoList = loginUser.getSimpleRoleInfoList();
|
||||||
|
|
||||||
|
// 组装token和过期时间
|
||||||
|
loginDetailsResponse.setToken(loginResponse.getToken());
|
||||||
|
loginDetailsResponse.setExpireAt(loginResponse.getExpireAt());
|
||||||
|
|
||||||
|
// 组装用户信息
|
||||||
|
SimpleUserDetail simpleUserDetail = new SimpleUserDetail();
|
||||||
|
simpleUserDetail.setUserId(loginUser.getUserId());
|
||||||
|
simpleUserDetail.setName(simpleUserInfo.getRealName());
|
||||||
|
|
||||||
|
// todo 地址信息
|
||||||
|
simpleUserDetail.setAddress("北京市");
|
||||||
|
simpleUserDetail.setPosition("总经理");
|
||||||
|
|
||||||
|
// 设置头像,并获取头像的url
|
||||||
|
Long avatarFileId = loginResponse.getLoginUser().getSimpleUserInfo().getAvatar();
|
||||||
|
String userAvatarUrl = sysUserService.getUserAvatarUrl(avatarFileId, loginResponse.getToken());
|
||||||
|
|
||||||
|
simpleUserDetail.setAvatar(userAvatarUrl);
|
||||||
|
loginDetailsResponse.setUser(simpleUserDetail);
|
||||||
|
|
||||||
|
// 组装权限
|
||||||
|
ArrayList<SimpleAuthDetail> authInfos = new ArrayList<>();
|
||||||
|
for (SimpleRoleInfo simpleRoleInfo : simpleRoleInfoList) {
|
||||||
|
SimpleAuthDetail simpleAuthDetail = new SimpleAuthDetail();
|
||||||
|
simpleAuthDetail.setId(simpleRoleInfo.getRoleCode());
|
||||||
|
// todo 没有按钮信息
|
||||||
|
simpleAuthDetail.setOperation(null);
|
||||||
|
authInfos.add(simpleAuthDetail);
|
||||||
|
}
|
||||||
|
loginDetailsResponse.setPermissions(authInfos);
|
||||||
|
loginDetailsResponse.setRoles(authInfos);
|
||||||
|
|
||||||
|
// 登录人的ws-url
|
||||||
|
loginDetailsResponse.setWsUrl(loginUser.getWsUrl());
|
||||||
|
|
||||||
|
return loginDetailsResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -72,13 +72,6 @@
|
||||||
<version>7.0.2</version>
|
<version>7.0.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!--登录日志的业务-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.stylefeng.roses</groupId>
|
|
||||||
<artifactId>log-business-login-log</artifactId>
|
|
||||||
<version>7.0.2</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
package cn.stylefeng.roses.kernel.system.starter.init;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.constants.SystemConstants;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.resource.entity.SysResource;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.resource.service.SysResourceService;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.role.entity.SysRole;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.role.entity.SysRoleResource;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.role.service.SysRoleResourceService;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.role.service.SysRoleService;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化admin管理员的服务
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2020/12/17 21:56
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class InitAdminService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysRoleService sysRoleService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysResourceService sysResourceService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysRoleResourceService sysRoleResourceService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化超级管理员,超级管理员拥有最高权限
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2020/12/17 21:57
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void initSuperAdmin() {
|
||||||
|
|
||||||
|
// 找到超级管理员的角色id
|
||||||
|
LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(SysRole::getRoleCode, SystemConstants.SUPER_ADMIN_ROLE_CODE);
|
||||||
|
SysRole superAdminRole = sysRoleService.getOne(queryWrapper);
|
||||||
|
|
||||||
|
// 删除这个角色绑定的所有资源
|
||||||
|
LambdaUpdateWrapper<SysRoleResource> sysRoleResourceLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
sysRoleResourceLambdaUpdateWrapper.eq(SysRoleResource::getRoleId, superAdminRole.getRoleId());
|
||||||
|
sysRoleResourceService.remove(sysRoleResourceLambdaUpdateWrapper);
|
||||||
|
|
||||||
|
// 找到所有Resource,将所有资源赋给这个角色
|
||||||
|
LambdaQueryWrapper<SysResource> sysResourceLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
sysResourceLambdaQueryWrapper.select(SysResource::getResourceCode);
|
||||||
|
List<SysResource> resources = sysResourceService.list(sysResourceLambdaQueryWrapper);
|
||||||
|
|
||||||
|
ArrayList<SysRoleResource> sysRoleResources = new ArrayList<>();
|
||||||
|
for (SysResource resource : resources) {
|
||||||
|
SysRoleResource sysRoleResource = new SysRoleResource();
|
||||||
|
sysRoleResource.setResourceCode(resource.getResourceCode());
|
||||||
|
sysRoleResource.setRoleId(superAdminRole.getRoleId());
|
||||||
|
sysRoleResources.add(sysRoleResource);
|
||||||
|
}
|
||||||
|
sysRoleResourceService.saveBatch(sysRoleResources, sysRoleResources.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package cn.stylefeng.roses.kernel.system.starter.listener;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.system.api.constants.SystemConstants;
|
||||||
|
import cn.stylefeng.roses.kernel.system.starter.init.InitAdminService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||||
|
import org.springframework.context.ApplicationListener;
|
||||||
|
import org.springframework.core.Ordered;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目启动后初始化超级管理员
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2020/12/17 21:44
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class SuperAdminInitListener implements ApplicationListener<ApplicationReadyEvent>, Ordered {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private InitAdminService initAdminService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
|
||||||
|
initAdminService.initSuperAdmin();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getOrder() {
|
||||||
|
return SystemConstants.SUPER_ADMIN_INIT_LISTENER_SORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue