2021与蓝度共同重构项目,服务端
chenjiantian
2021-11-29 440235a6bd5a474c2a3d26687a77c8a8f47025a0
first commit
已添加3个文件
已修改4个文件
已重命名1个文件
233 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/enums/AdministratorEnums.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/CustomerJwtUser.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/PermissionConfig.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AdminDetailsServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/ClientService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/CustomerDetailsServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/AdministratorEnums.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.sandu.ximon.dao.enums;
/**
 * ç®¡ç†å‘˜ç±»åž‹
 *
 * @author chenjiantian
 */
public enum AdministratorEnums {
    /**
     * ç®¡ç†å‘˜
     */
    ADMIN(0),
    /**
     * å®¢æˆ·
     */
    CUSTOMER(1),
    /**
     * ç®¡ç†å‘˜è´¦å·è¿›å…¥å®¢æˆ·
     */
    INSPECT_CUSTOMER(2),
    ;
    private final Integer code;
    AdministratorEnums(Integer code) {
        this.code = code;
    }
    public Integer getCode() {
        return code;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
@@ -1,6 +1,7 @@
package com.sandu.ximon.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapBuilder;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -22,6 +23,7 @@
import com.sandu.ximon.dao.domain.Admin;
import com.sandu.ximon.dao.domain.Menu;
import com.sandu.ximon.dao.domain.Role;
import com.sandu.ximon.dao.enums.AdministratorEnums;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -68,7 +70,10 @@
            return ResponseUtil.error(ResponseStatusEnums.BAD_CREDENTIALS.getCode(), ResponseStatusEnums.BAD_CREDENTIALS.getMessage());
        }
        UserDetails userJwtUser = new AdminJwtUser(admin, roleService.mapToGrantedAuthorities(admin.getId()));
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userJwtUser, admin.getId(), userJwtUser.getAuthorities());
        if(!userJwtUser.isEnabled()){
            return ResponseUtil.error(ResponseStatusEnums.DISABLE_ACCOUNT.getCode(), ResponseStatusEnums.DISABLE_ACCOUNT.getMessage());
        }
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userJwtUser, AdministratorEnums.ADMIN.getCode(), userJwtUser.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
@@ -96,13 +101,17 @@
    @GetMapping(value = "/info")
    public ResponseVO<Object> getUserInfo() {
        Integer administratorIdentity = SecurityUtils.getAdministratorIdentity();
        Long userId = SecurityUtils.getUserId();
        Admin admin = adminService.getById(userId);
        List<Role> roles = roleService.listByAdminId(admin.getId());
        List<Menu> menus = menuService.listByRoleIds(roles.stream().map(Role::getId).collect(Collectors.toList()));
        MapBuilder<Object, Object> builder = MapUtil.builder().put("info", admin);
        if(CollectionUtil.isNotEmpty(menus)){
        List<Menu> collect = menus.stream().filter(menu -> menu.getType() == 0).collect(Collectors.toList());
        Map<Object, Object> build = MapUtil.builder().put("info", admin).put("menus", collect).build();
        return ResponseUtil.success(build);
            builder.put("menus", collect);
        }
        return ResponseUtil.success(builder.build());
    }
    @GetMapping(value = "/list")
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/CustomerJwtUser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.sandu.ximon.admin.dto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.sandu.common.enums.AdminStatusStatus;
import com.sandu.ximon.dao.domain.Admin;
import com.sandu.ximon.dao.domain.Client;
import lombok.Getter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.stream.Collectors;
/**
 * @author chenjiantian
 * @date 2021/4/23 17:45
 */
@Getter
public class CustomerJwtUser implements UserDetails {
    private final Client user;
    @JsonIgnore
    private final Collection<GrantedAuthority> authorities;
    public CustomerJwtUser(Client admin, Collection<GrantedAuthority> authorities) {
        this.user = admin;
        this.authorities = authorities;
    }
    public Collection<String> getRoles() {
        return authorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toSet());
    }
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }
    @JsonIgnore
    @Override
    public String getPassword() {
        return user.getMobile();
    }
    @Override
    public String getUsername() {
        return user.getMobile();
    }
    @JsonIgnore
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
    @JsonIgnore
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
    @JsonIgnore
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
    @Override
    public boolean isEnabled() {
//        return AdminStatusStatus.NORMAL.getCode().equals(user.getStatus());
        return true;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/PermissionConfig.java
@@ -15,11 +15,11 @@
@Service(value = "p")
public class PermissionConfig {
    public Boolean check(String... permissions) {
        // èŽ·å–å½“å‰ç”¨æˆ·çš„æ‰€æœ‰æƒé™
        List<String> elPermissions = SecurityUtils.getUserDetails().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
        // åˆ¤æ–­å½“前用户的所有权限是否包含接口上定义的权限
        return elPermissions.contains("admin") || Arrays.stream(permissions).anyMatch(elPermissions::contains);
    }
//    public Boolean check(String... permissions) {
//
//        // èŽ·å–å½“å‰ç”¨æˆ·çš„æ‰€æœ‰æƒé™
//        List<String> elPermissions = SecurityUtils.getUserDetails().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
//        // åˆ¤æ–­å½“前用户的所有权限是否包含接口上定义的权限
//        return elPermissions.contains("admin") || Arrays.stream(permissions).anyMatch(elPermissions::contains);
//    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
@@ -15,8 +15,7 @@
import com.sandu.common.security.jwt.JwtTokenProvider;
import com.sandu.common.util.RequestHolder;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.dto.AdminJwtUser;
import com.sandu.ximon.dao.domain.Admin;
import com.sandu.ximon.dao.enums.AdministratorEnums;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
@@ -32,19 +31,26 @@
 */
public class SecurityUtils {
    public static UserDetails getUserDetails() {
    /**
     * èŽ·å–ç”¨æˆ·ä¿¡æ¯
     */
    private static UserDetails getUserDetails() {
        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null) {
            throw new BusinessException(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage());
        }
        if (authentication.getPrincipal() instanceof UserDetails) {
        Integer administratorIdentity = getAdministratorIdentity();
        if (AdministratorEnums.ADMIN.getCode().equals(administratorIdentity) || AdministratorEnums.INSPECT_CUSTOMER.getCode().equals(administratorIdentity)) {
            UserDetails userDetails = (UserDetails) authentication.getPrincipal();
            UserDetailsService userDetailsService = SpringContextHolder.getBean(UserDetailsService.class);
            UserDetailsService userDetailsService = SpringContextHolder.getBean("adminDetailsService");
            return userDetailsService.loadUserByUsername(userDetails.getUsername());
        } else if (AdministratorEnums.CUSTOMER.getCode().equals(administratorIdentity)) {
            UserDetails userDetails = (UserDetails) authentication.getPrincipal();
            UserDetailsService userDetailsService = SpringContextHolder.getBean("customerDetailsService");
            return userDetailsService.loadUserByUsername(userDetails.getUsername());
        }
        return null;
//        throw new BusinessException(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage());
    }
    /**
@@ -62,6 +68,19 @@
    }
    /**
     * èŽ·å–ç®¡ç†å‘˜èº«ä»½ï¼Œ ç±»åž‹å¯è§ {{@link AdministratorEnums}}
     *
     * @return
     */
    public static Integer getAdministratorIdentity() {
        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null) {
            throw new BusinessException(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage());
        }
        return (Integer) authentication.getCredentials();
    }
    /**
     * èŽ·å–ç³»ç»Ÿç”¨æˆ·id
     *
     * @return ç³»ç»Ÿç”¨æˆ·id
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AdminDetailsServiceImpl.java
ÎļþÃû´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/service/UserDetailsServiceImpl.java ÐÞ¸Ä
@@ -2,6 +2,7 @@
import com.sandu.ximon.admin.dto.AdminJwtUser;
import com.sandu.ximon.dao.domain.Admin;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Service;
@@ -11,20 +12,22 @@
 * @author hupeng
 * @date 2018-11-22
 */
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
@Slf4j
@Service("adminDetailsService")
public class AdminDetailsServiceImpl implements UserDetailsService {
    private final AdminService adminService;
    private final RoleService roleService;
    public UserDetailsServiceImpl(AdminService userService, RoleService roleService) {
    public AdminDetailsServiceImpl(AdminService userService, RoleService roleService) {
        this.adminService = userService;
        this.roleService = roleService;
    }
    @Override
    public UserDetails loadUserByUsername(String username) {
        log.info("loadUserByUsername ==  {}",username);
        Admin admin = adminService.findByUserName(username);
        if (admin == null) {
            throw new IllegalArgumentException("账号不存在");
ximon-admin/src/main/java/com/sandu/ximon/admin/service/ClientService.java
@@ -4,6 +4,7 @@
import com.sandu.common.execption.BusinessException;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.ClientPrarm;
import com.sandu.ximon.dao.domain.Admin;
import com.sandu.ximon.dao.domain.Client;
import com.sandu.ximon.dao.mapper.ClientMapper;
import lombok.AllArgsConstructor;
@@ -49,4 +50,7 @@
        return removeById(id);
    }
    public Client findByPhone(String phone) {
        return getOne(Wrappers.lambdaQuery(Client.class).eq(Client::getMobile, phone).last("limit 1"));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/CustomerDetailsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import com.sandu.ximon.admin.dto.AdminJwtUser;
import com.sandu.ximon.admin.dto.CustomerJwtUser;
import com.sandu.ximon.dao.domain.Client;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;
/**
 * @author hupeng
 * @date 2018-11-22
 */
@Slf4j
@Service("customerDetailsService")
public class CustomerDetailsServiceImpl implements UserDetailsService {
    private final ClientService adminService;
    public CustomerDetailsServiceImpl(ClientService userService) {
        this.adminService = userService;
    }
    @Override
    public UserDetails loadUserByUsername(String username) {
        log.info("loadUserByUsername  CustomerDetailsServiceImpl ==  {}",username);
        Client admin = adminService.findByPhone(username);
        if (admin == null) {
            throw new IllegalArgumentException("账号不存在");
        } else {
            return createJwtUser(admin);
        }
    }
    private UserDetails createJwtUser(Client admin) {
        return new CustomerJwtUser(
                admin,
                CollectionUtil.newHashSet("c").stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList())
        );
    }
}