【7.0.2】登录模块放到system

pull/2/head
fengshuonan 2021-03-17 18:09:43 +08:00
parent 62b05e4835
commit 215ea52f8b
10 changed files with 407 additions and 7 deletions

View File

@ -43,6 +43,13 @@
<version>7.0.2</version>
</dependency>
<!--登录日志的业务-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>log-business-login-log</artifactId>
<version>7.0.2</version>
</dependency>
</dependencies>
</project>

View File

@ -48,4 +48,14 @@ public interface SystemConstants {
*/
Long USER_CACHE_TIMEOUT_SECONDS = 3600L;
/**
*
*/
String SUPER_ADMIN_ROLE_CODE = "superAdmin";
/**
*
*/
Integer SUPER_ADMIN_INIT_LISTENER_SORT = 400;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -72,13 +72,6 @@
<version>7.0.2</version>
</dependency>
<!--登录日志的业务-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>log-business-login-log</artifactId>
<version>7.0.2</version>
</dependency>
</dependencies>
</project>

View File

@ -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());
}
}

View File

@ -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;
}
}