feat: 完成用户登录

This commit is contained in:
wyl
2022-11-18 00:32:42 +08:00
parent 851baa3d72
commit 8ce4354fd6
21 changed files with 273 additions and 43 deletions
@@ -1,5 +1,6 @@
package com.aos.auth.enums;
import com.aos.common.model.AosBaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -10,7 +11,7 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum RelationshipEnum {
public enum RelationshipEnum implements AosBaseEnum {
/**
*
*/
@@ -1,5 +1,6 @@
package com.aos.auth.enums;
import com.aos.common.model.AosBaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -10,7 +11,7 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum RelationshipTypeEnum {
public enum RelationshipTypeEnum implements AosBaseEnum {
/**
*
*/
@@ -1,5 +1,6 @@
package com.aos.auth.enums;
import com.aos.common.model.AosBaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -10,7 +11,7 @@ import lombok.Getter;
*/
@AllArgsConstructor
@Getter
public enum ResourceTypeEnum {
public enum ResourceTypeEnum implements AosBaseEnum {
/**
*
*/
@@ -0,0 +1,24 @@
package com.aos.auth.enums;
import com.aos.common.model.AosBaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author: wangyl
* @date: 2022/11/17
* @description: 用户状态
*/
@Getter
@AllArgsConstructor
public enum UserStateTypeEnum implements AosBaseEnum {
/**
*
*/
ENABLE(1, "启用"),
DISABLE(2, "禁用"),
ADMIN(3, "管理员"),
;
private Integer value;
private String desc;
}
+4 -4
View File
@@ -27,9 +27,9 @@
<groupId>com.aos</groupId>
<artifactId>aos-swagger</artifactId>
</dependency>
<dependency>
<groupId>com.aos</groupId>
<artifactId>aos-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.aos</groupId>-->
<!-- <artifactId>aos-web</artifactId>-->
<!-- </dependency>-->
</dependencies>
</project>
@@ -53,6 +53,16 @@ public class PathConstant {
*/
final static public String DETAILS = "details/";
/**
* admin
*/
final static public String ADMIN = "admin/";
/**
* 重置密码
*/
final static public String REST_PASSWORD = "restPassword/";
/**
* 获取列表
*/
@@ -67,4 +77,8 @@ public class PathConstant {
* 获取树
*/
final static public String TREE = "tree/";
/**
* 当前用户权限
*/
final static public String USER_PREM = "user/prem";
}
@@ -1,9 +1,25 @@
package com.aos.auth.conf;
import com.aos.swagger.enable.EnableSwagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableSwagger(applicationName = "auth", scanPackagesPath = "com.aos.auth.controller")
public class WebConfig {
/**
* @param
* @return org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
* @Description 密码加密对象
* @Date 2019/12/22 17:48
* @Author wangyl
* @Version V1.0
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@@ -2,21 +2,36 @@ package com.aos.auth.controller;
import com.aos.auth.PathConstant;
import com.aos.auth.domain.req.user.LoginUseReq;
import com.aos.auth.service.AosAuthLoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping(PathConstant.BASE_API)
@Api(tags = "用户登录接口")
@Slf4j
@RequiredArgsConstructor(onConstructor__ = @Autowired)
public class LoginController {
private final AosAuthLoginService aosAuthLoginService;
@PostMapping(PathConstant.LOGIN)
@ApiOperation("登录")
public String login(@RequestBody LoginUseReq loginUseReq) {
return "ok1";
String token = aosAuthLoginService.login(loginUseReq);
return token;
}
@GetMapping(PathConstant.USER_PREM)
@ApiOperation("获取当前用户权限码")
public List<String> userPrem() {
List<String> strings = aosAuthLoginService.userPrem();
return strings;
}
@GetMapping(PathConstant.LOGOUT)
@@ -50,9 +50,9 @@ public class UserController {
aosAuthUsersService.deleteUser(ids);
}
@PutMapping(PathConstant.LIST)
@PostMapping(PathConstant.LIST)
@ApiOperation("获取用户列表")
public Page<UserVo> list(@RequestParam(value = "req") UserPageReq req) {
public Page<UserVo> list(@RequestBody UserPageReq req) {
Page<UserVo> userVoPage = aosAuthUsersService.pageList(req);
return userVoPage;
}
@@ -64,5 +64,15 @@ public class UserController {
return userVo;
}
@GetMapping(PathConstant.ADMIN)
@ApiOperation("升级为管理员")
public void makeToAdmin(@RequestParam(value = "userId") Long userId) {
aosAuthUsersService.makeToAdmin(userId);
}
@PostMapping(PathConstant.REST_PASSWORD)
@ApiOperation("重置密码")
public void restPassword(@RequestBody List<Long> ids) {
aosAuthUsersService.resetPassword(ids);
}
}
@@ -54,7 +54,7 @@ public class AosAuthUsers extends BaseEntity implements Serializable {
private String phone;
/**
* 0 失效 1 启用
* 1 启用 2 停用 3 管理员
*/
@TableField(value = "state")
private Integer state;
@@ -5,9 +5,12 @@ import io.jsonwebtoken.Claims;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author wangyl
@@ -19,6 +22,10 @@ import java.util.List;
@Data
@AllArgsConstructor
public class SecurityUser implements UserDetails {
/**
* 用户id
*/
private Long id;
/**
* 用户名
*/
@@ -27,6 +34,15 @@ public class SecurityUser implements UserDetails {
* 用户密码
*/
private String password;
/**
* 邮箱
*/
private String email;
/**
* 手机号
*/
private String phone;
/**
* 账户是否未过期,过期无法验证
*/
@@ -43,18 +59,36 @@ public class SecurityUser implements UserDetails {
* 是否可用
*/
private Boolean isEnabled;
/**
* 权限列表
*/
private List<GrantedAuthority> authorities;
public SecurityUser(String username, String password, List<GrantedAuthority> authorities) {
this(username, password, true, true, true, true, authorities);
/**
* 用户状态 1启用 2停用 3管理员
*/
private Integer state;
public SecurityUser(Long id, String username, String password, String email, String phone, Integer state, List<GrantedAuthority> authorities) {
this(id, username, password, email, phone, true, true, true, true, authorities, state);
}
public SecurityUser(String token) {
Claims claimsFromToken = TokenUtilBase.getClaimsFromToken(token);
claimsFromToken.get("username");
id = claimsFromToken.get("id", Long.class);
username = claimsFromToken.get("username", String.class);
email = claimsFromToken.get("email", String.class);
phone = claimsFromToken.get("phone", String.class);
isAccountNonExpired = claimsFromToken.get("isAccountNonExpired", Boolean.class);
isAccountNonLocked = claimsFromToken.get("isAccountNonLocked", Boolean.class);
isCredentialsNonExpired = claimsFromToken.get("isCredentialsNonExpired", Boolean.class);
isEnabled = claimsFromToken.get("isEnabled", Boolean.class);
List<Map> permissions = (List<Map>) claimsFromToken.get("authorities");
List<Object> authority = permissions.parallelStream()
.map(permission -> permission.get("authority"))
.collect(Collectors.toList());
authorities = AuthorityUtils.createAuthorityList(authority.toArray(new String[0]));
}
/**
@@ -1,4 +1,45 @@
package com.aos.auth.domain.vo.user;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(description = "用户信息")
public class UserVo {
/**
* 用户自增id
*/
@ApiModelProperty(value = "id")
private Long id;
/**
* 登录id
*/
@ApiModelProperty(value = "account")
private String account;
/**
* 用户名称
*/
@ApiModelProperty(value = "name")
private String name;
/**
* 用户邮箱
*/
@ApiModelProperty(value = "email")
private String email;
/**
* 手机号
*/
@ApiModelProperty(value = "phone")
private String phone;
/**
* 0 失效 1 启用
*/
@ApiModelProperty(value = "state")
private Integer state;
}
@@ -8,8 +8,10 @@ import com.aos.auth.domain.vo.role.RoleVo;
import com.aos.auth.enums.RelationshipEnum;
import com.aos.auth.enums.RelationshipTypeEnum;
import com.aos.auth.enums.RoleEnableEnum;
import com.aos.auth.enums.UserStateTypeEnum;
import com.aos.auth.mapper.AosAuthRolesMapper;
import com.aos.auth.service.AosAuthRelationshipService;
import com.aos.auth.service.AosAuthResourcesService;
import com.aos.auth.service.AosAuthRolesService;
import com.aos.common.copy.AosBeanUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -37,6 +39,7 @@ import java.util.stream.Collectors;
@Slf4j
public class AosAuthRolesServiceImpl extends ServiceImpl<AosAuthRolesMapper, AosAuthRoles> implements AosAuthRolesService {
final private AosAuthRelationshipService aosAuthRelationshipService;
final private AosAuthResourcesService aosAuthResourcesService;
/**
* 通过用户id 关联角色表 获取用户的权限
@@ -47,14 +50,19 @@ public class AosAuthRolesServiceImpl extends ServiceImpl<AosAuthRolesMapper, Aos
* @Author wangyl
*/
@Override
public Set<String> getUserAuthByUserId(Long userId) {
List<AosAuthRoles> roleList = aosAuthRelationshipService.getUserHasRoleIds(Arrays.asList(userId));
if (CollectionUtils.isEmpty(roleList)) {
log.warn("用户id【{}】,没有获取到角色", userId);
return new HashSet<>();
public Set<String> getUserAuthByUserId(Long userId, Integer userState) {
List<AosAuthResources> roleHasPermsIds = new ArrayList<>();
if (Objects.equals(UserStateTypeEnum.ADMIN.getValue(), userState)) {
roleHasPermsIds = aosAuthResourcesService.list();
} else {
List<AosAuthRoles> roleList = aosAuthRelationshipService.getUserHasRoleIds(Arrays.asList(userId));
if (CollectionUtils.isEmpty(roleList)) {
log.warn("用户id【{}】,没有获取到角色", userId);
return new HashSet<>();
}
Set<Long> roleIds = roleList.stream().map(AosAuthRoles::getId).collect(Collectors.toSet());
roleHasPermsIds = aosAuthRelationshipService.getRoleHasPermsIds(roleIds);
}
Set<Long> roleIds = roleList.stream().map(AosAuthRoles::getId).collect(Collectors.toSet());
List<AosAuthResources> roleHasPermsIds = aosAuthRelationshipService.getRoleHasPermsIds(roleIds);
Set<String> permsIds = roleHasPermsIds.stream().map(AosAuthResources::getResourcePerms).collect(Collectors.toSet());
return permsIds;
}
@@ -6,11 +6,13 @@ import com.aos.auth.domain.req.user.UserReq;
import com.aos.auth.domain.vo.user.UserVo;
import com.aos.auth.enums.RelationshipEnum;
import com.aos.auth.enums.RelationshipTypeEnum;
import com.aos.auth.enums.UserStateTypeEnum;
import com.aos.auth.mapper.AosAuthUsersMapper;
import com.aos.auth.service.AosAuthRelationshipService;
import com.aos.auth.service.AosAuthUsersService;
import com.aos.common.copy.AosBeanUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -24,6 +26,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
@@ -115,6 +118,7 @@ public class AosAuthUsersServiceImpl extends ServiceImpl<AosAuthUsersMapper, Aos
String account = req.getAccount();
String email = req.getEmail();
String phone = req.getPhone();
req.setPassword("888888");
List<Long> roleIds = req.getRoleIds();
Boolean exist = this.exist(account, email, phone, null);
if (exist) {
@@ -184,6 +188,38 @@ public class AosAuthUsersServiceImpl extends ServiceImpl<AosAuthUsersMapper, Aos
}
}
/**
* 指定用户变为admin
*
* @param userId
* @return void
* @Date 2022/11/18
* @Author wangyl
*/
@Override
public void makeToAdmin(Long userId) {
AosAuthUsers aosAuthUsers = new AosAuthUsers();
aosAuthUsers.setId(userId);
aosAuthUsers.setState(UserStateTypeEnum.ADMIN.getValue());
this.updateById(aosAuthUsers);
}
/**
* 批量重置密码
*
* @param userIds
* @return void
* @Date 2022/11/18
* @Author wangyl
*/
@Override
public void resetPassword(Collection<Long> userIds) {
LambdaUpdateWrapper<AosAuthUsers> aosAuthUsersLambdaUpdateWrapper = Wrappers.lambdaUpdate(AosAuthUsers.class);
aosAuthUsersLambdaUpdateWrapper.set(AosAuthUsers::getPassword, passwordEncoder.encode("888888"));
aosAuthUsersLambdaUpdateWrapper.in(AosAuthUsers::getId, userIds);
}
/**
* 用户密码加密
*
@@ -3,6 +3,8 @@ package com.aos.auth.service.impl.security;
import com.aos.auth.domain.req.user.LoginUseReq;
import com.aos.auth.domain.security.SecurityUser;
import com.aos.auth.service.AosAuthLoginService;
import com.aos.common.model.context.CurrentUserContextHolder;
import com.aos.common.model.context.SecurityUserInfo;
import com.aos.common.token.TokenUtilBase;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -12,6 +14,8 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author: wangyl
* @date: 2022/11/12
@@ -45,4 +49,10 @@ public class AosAuthLoginServiceImpl implements AosAuthLoginService {
String token = TokenUtilBase.generateToken(beanMap);
return token;
}
@Override
public List<String> userPrem() {
SecurityUserInfo context = CurrentUserContextHolder.getContext();
return context.getAuthorities();
}
}
@@ -1,7 +1,8 @@
package com.aos.auth.service.impl;
package com.aos.auth.service.impl.security;
import com.aos.auth.domain.entity.AosAuthUsers;
import com.aos.auth.domain.security.SecurityUser;
import com.aos.auth.enums.UserStateTypeEnum;
import com.aos.auth.service.AosAuthRolesService;
import com.aos.auth.service.AosAuthUsersService;
import lombok.RequiredArgsConstructor;
@@ -34,14 +35,14 @@ public class AosUserDetailServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
AosAuthUsers userByAccount = aosAuthUsersService.getUserByAccount(username);
if (Objects.isNull(userByAccount)) {
if (Objects.isNull(userByAccount) || Objects.equals(UserStateTypeEnum.DISABLE.getValue(), userByAccount.getState())) {
/**
* TODO 分装异常
*/
throw new UsernameNotFoundException("");
}
List<GrantedAuthority> userAuthorities = this.getUserAuthorities(userByAccount.getId());
return new SecurityUser(username, userByAccount.getPassword(), userAuthorities);
List<GrantedAuthority> userAuthorities = this.getUserAuthorities(userByAccount.getId(), userByAccount.getState());
return new SecurityUser(userByAccount.getId(), userByAccount.getName(), userByAccount.getPassword(), userByAccount.getEmail(), userByAccount.getPhone(), userByAccount.getState(), userAuthorities);
}
/**
@@ -52,8 +53,8 @@ public class AosUserDetailServiceImpl implements UserDetailsService {
* @Date 2022/11/12 .
* @Author wangyl
*/
private List<GrantedAuthority> getUserAuthorities(Long userId) {
Set<String> perms = aosAuthRolesService.getUserAuthByUserId(userId);
private List<GrantedAuthority> getUserAuthorities(Long userId, Integer state) {
Set<String> perms = aosAuthRolesService.getUserAuthByUserId(userId, state);
/**
* SET 权限信息 转化为标准权限信息
*/
@@ -110,17 +110,4 @@ public class WebSercurityConfig extends WebSecurityConfigurerAdapter {
return super.authenticationManagerBean();
}
/**
* @param
* @return org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
* @Description 密码加密对象
* @Date 2019/12/22 17:48
* @Author wangyl
* @Version V1.0
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author wyl
@@ -59,7 +60,10 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
/**
* 用户基础信息放入本地缓存
*/
SecurityUserInfo securityUserInfo = AosBeanUtils.copyProperties(securityUser, SecurityUserInfo::new);
SecurityUserInfo securityUserInfo = AosBeanUtils.copyProperties(securityUser, SecurityUserInfo::new, (s, t) -> {
List<String> authorities = s.getAuthorities().stream().map(o -> o.getAuthority()).collect(Collectors.toList());
t.setAuthorities(authorities);
});
CurrentUserContextHolder.setContext(securityUserInfo);
}
filterChain.doFilter(httpServletRequest, httpServletResponse);
@@ -2,6 +2,8 @@ package com.aos.auth.service;
import com.aos.auth.domain.req.user.LoginUseReq;
import java.util.List;
/**
* @author: wangyl
* @date: 2022/11/12
@@ -17,4 +19,7 @@ public interface AosAuthLoginService {
* @Author wangyl
*/
String login(LoginUseReq loginUseReq);
List<String> userPrem();
}
@@ -19,12 +19,13 @@ public interface AosAuthRolesService extends IService<AosAuthRoles> {
/**
* 通过用户id 关联角色表 获取用户的权限
*
* @param userId
* @param userId 用户id
* @param userState 用户状态
* @return java.util.Set<java.lang.String>
* @Date 2022/11/12
* @Author wangyl
*/
Set<String> getUserAuthByUserId(Long userId);
Set<String> getUserAuthByUserId(Long userId, Integer userState);
/**
* 添加角色
@@ -7,6 +7,7 @@ import com.aos.auth.domain.vo.user.UserVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
@@ -87,4 +88,24 @@ public interface AosAuthUsersService extends IService<AosAuthUsers> {
* @Author wangyl
*/
void updateUser(UserReq req);
/**
* 指定用户变为admin
*
* @param userId
* @return void
* @Date 2022/11/18
* @Author wangyl
*/
void makeToAdmin(Long userId);
/**
* 批量重置密码
*
* @param userIds
* @return void
* @Date 2022/11/18
* @Author wangyl
*/
void resetPassword(Collection<Long> userIds);
}