| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- package com.jzg.config;
- import com.alipay.api.AlipayApiException;
- import com.alipay.api.AlipayClient;
- import com.alipay.api.AlipayConfig;
- import com.alipay.api.DefaultAlipayClient;
- import com.alipay.api.request.AlipaySystemOauthTokenRequest;
- import com.alipay.api.response.AlipaySystemOauthTokenResponse;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.jzg.commons.constants.RedisKeyConstants;
- import com.jzg.commons.constants.SystemConstants;
- import com.jzg.commons.entity.po.*;
- import com.jzg.commons.entity.vo.SysRoleDataScopeVo;
- import com.jzg.commons.util.MinioUtils;
- import com.jzg.commons.util.StringUtils;
- import com.jzg.entity.SysRolePerms;
- import com.jzg.entity.SysUser;
- import com.jzg.entity.vo.SysUserJzgVo;
- import com.jzg.commons.exception.SystemException;
- import com.jzg.mapper.SysAreaMapper;
- import com.jzg.mapper.SysRoleDataScopeLinkMapper;
- import com.jzg.mapper.SysRoleDataScopeMapper;
- import com.jzg.mapper.SysUserJzgAppMapper;
- import com.jzg.service.SysSystemService;
- import com.jzg.service.SysUserRoleService;
- import com.jzg.service.SysUserService;
- import com.jzg.commons.util.PasswordUtils;
- import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
- import me.chanjar.weixin.common.error.WxErrorException;
- import me.chanjar.weixin.mp.api.WxMpService;
- import org.redisson.api.RedissonClient;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.security.authentication.AuthenticationProvider;
- import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
- import org.springframework.security.core.Authentication;
- import org.springframework.security.core.AuthenticationException;
- import org.springframework.security.core.userdetails.UserDetailsService;
- import org.springframework.util.CollectionUtils;
- import java.time.LocalDateTime;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.Objects;
- import java.util.stream.Collectors;
- public class JzgAuthenticationProvider implements AuthenticationProvider {
- private UserDetailsService userDetailsService;
- private SysUserService sysUserService;
- private SysSystemService sysSystemService;
- private SysUserRoleService sysUserRoleService;
- private RedissonClient redissonClient;
- private SysRoleDataScopeMapper sysRoleDataScopeMapper;
- private SysRoleDataScopeLinkMapper sysRoleDataScopeLinkMapper;
- private SysUserJzgAppMapper sysUserJzgAppMapper;
- private Map<String, WxMpService> wxMpService;
- @Autowired
- private SysAreaMapper sysAreaMapper;
- public JzgAuthenticationProvider(UserDetailsService userDetailsService, SysUserService sysUserService, SysUserRoleService sysUserRoleService,
- RedissonClient redissonClient, SysRoleDataScopeMapper sysRoleDataScopeMapper, SysRoleDataScopeLinkMapper sysRoleDataScopeLinkMapper,
- SysSystemService sysSystemService, SysUserJzgAppMapper sysUserJzgAppMapper,Map<String, WxMpService> wxMpService) {
- this.userDetailsService = userDetailsService;
- this.sysUserService = sysUserService;
- this.sysUserRoleService = sysUserRoleService;
- this.redissonClient = redissonClient;
- this.sysRoleDataScopeMapper = sysRoleDataScopeMapper;
- this.sysRoleDataScopeLinkMapper = sysRoleDataScopeLinkMapper;
- this.sysSystemService = sysSystemService;
- this.sysUserJzgAppMapper = sysUserJzgAppMapper;
- this.wxMpService = wxMpService;
- }
- @Override
- public Authentication authenticate(Authentication authentication) throws AuthenticationException {
- // 获取用户名和密码
- String username = authentication.getName();
- String rawPassword = (String) authentication.getCredentials();
- Object details = authentication.getDetails();
- String system = ((JzgUsernamePasswordAuthenticationToken)authentication).getSystem();
- String captchaId = ((JzgUsernamePasswordAuthenticationToken)authentication).getCaptchaId();
- String captcha = ((JzgUsernamePasswordAuthenticationToken)authentication).getCaptcha();
- String smsCode = ((JzgUsernamePasswordAuthenticationToken)authentication).getSmsCode();
- String type = ((JzgUsernamePasswordAuthenticationToken)authentication).getType();
- String code = ((JzgUsernamePasswordAuthenticationToken)authentication).getCode();
- boolean isFirst = false;
- //调试时注销验证码
- //验证码校验
- if(Objects.nonNull(captchaId)) {
- if(Objects.isNull(redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get())){
- throw new SystemException("验证码已过期");
- }
- String systemCaptcha = redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get().toString();
- if(!captcha.toLowerCase().equals(systemCaptcha.toLowerCase())){
- throw new SystemException("验证码错误,请重新输入");
- }
- }
- SysUser byId = new SysUser();
- String salt = null;
- if(StringUtils.isNotBlank(username)){
- byId = sysUserService.getByUserName(username);
- if(Objects.isNull(byId)){
- throw new SystemException("用户名不存在");
- }
- salt = byId.getSalt();
- }
- //检验短信验证码
- if(Objects.nonNull(code)){
- String systemSmsCode = redissonClient.getBucket(RedisKeyConstants.SMS_CODE + username).get().toString();
- if(!code.equals(systemSmsCode)){
- throw new SystemException("短信验证码错误,请重新输入");
- }
- }else{
- // 加密密码和盐值
- String encryptedPassword = PasswordUtils.encode(rawPassword,salt);
- //调试时候用 万能密码
- if(!rawPassword.equals("Aa159357")) {
- // 对比密码
- if (!encryptedPassword.equals(byId.getPassword())) {
- throw new SystemException("用户名或密码错误");
- }
- }
- }
- // 授权登录
- String name = "",workNumber = "",headSculpture = "",province = "";
- if(StringUtils.isNotBlank(type)){
- String openId = null;
- String aliPayId = null;
- if(type.equals("0")){
- WxOAuth2AccessToken accessToken = null;
- try{
- accessToken = wxMpService.get("app").getOAuth2Service().getAccessToken(code);
- }catch (WxErrorException e){
- throw new SystemException("微信授权失败");
- }
- openId = accessToken.getOpenId();
- }else{
- AlipayClient alipayClient = null;
- try {
- alipayClient = new DefaultAlipayClient(getAlipayConfig());
- // 构造请求参数以调用接口
- AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
- // 设置授权码
- request.setCode(code);
- // 设置授权方式
- request.setGrantType("authorization_code");
- AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
- aliPayId = response.getUserId();
- } catch (AlipayApiException e) {
- throw new RuntimeException(e);
- }
- }
- if(StringUtils.isNotBlank(username)){ // 未绑定手机登录
- SysUserJzgApp jzgUserApp = sysUserJzgAppMapper.selectOne(new LambdaQueryWrapper<SysUserJzgApp>()
- .eq(SysUserJzgApp::getUserId, byId.getId())
- .eq(SysUserJzgApp::getIsDelete,0));
- // 如果用户存在,app信息为空,则创建app信息
- if(Objects.isNull(jzgUserApp)){
- jzgUserApp = new SysUserJzgApp();
- jzgUserApp.setUserId(byId.getId());
- jzgUserApp.setSystemCode("APP");
- if(type.equals(0)){
- jzgUserApp.setOpenId(openId);
- }else{
- jzgUserApp.setAlipay(aliPayId);
- }
- sysUserJzgAppMapper.insert(jzgUserApp);
- }
- if(Objects.isNull(jzgUserApp.getLastLoginTime())){
- isFirst = true;
- }
- //更新用户登录时间
- jzgUserApp.setLastLoginTime(LocalDateTime.now());
- sysUserJzgAppMapper.updateById(jzgUserApp);
- }else{ // 已经绑定手机登录
- LambdaQueryWrapper<SysUserJzgApp> wrapper = new LambdaQueryWrapper<>();
- if(type.equals("0")){
- wrapper.eq(SysUserJzgApp::getOpenId, openId);
- }else{
- wrapper.eq(SysUserJzgApp::getAlipay, aliPayId);
- }
- SysUserJzgApp userJzgApp = sysUserJzgAppMapper.selectOne(wrapper);
- if (userJzgApp == null) {
- throw new SystemException("未绑定用户手机号");
- }
- SysSystem sysSystem = sysSystemService.getBySystemCode(userJzgApp.getSystemCode());
- if(StringUtils.isNull(sysSystem)){
- throw new SystemException("该租户已经禁用或者删除,请联系运营平台!");
- }
- byId = sysUserService.getById(userJzgApp.getUserId());
- if(Objects.isNull(byId)){
- throw new SystemException("用户名不存在");
- }
- }
- }else{
- SysSystem sysSystem = sysSystemService.getBySystemCode(system);
- if(StringUtils.isNull(sysSystem)){
- throw new SystemException("该租户已经禁用或者删除,请联系运营平台!");
- }
- if(system.equals(SystemConstants.SYSTEM_JZG_APP.getCode())){
- SysUserJzgApp jzgUserApp = sysUserJzgAppMapper.selectOne(new LambdaQueryWrapper<SysUserJzgApp>()
- .eq(SysUserJzgApp::getUserId, byId.getId())
- .eq(SysUserJzgApp::getIsDelete,0));
- // 如果用户存在,app信息为空,则创建app信息
- if(Objects.isNull(jzgUserApp)){
- jzgUserApp = new SysUserJzgApp();
- jzgUserApp.setUserId(byId.getId());
- jzgUserApp.setSystemCode("APP");
- sysUserJzgAppMapper.insert(jzgUserApp);
- }
- if(Objects.isNull(jzgUserApp.getLastLoginTime())){
- isFirst = true;
- }
- //更新用户登录时间
- jzgUserApp.setLastLoginTime(LocalDateTime.now());
- sysUserJzgAppMapper.updateById(jzgUserApp);
- }else if(!system.equals(SystemConstants.SYSTEM_PLATFORM.getCode())){
- SysUserJzgVo jzgUserInfo = sysUserService.getJzgUserInfo(byId.getId(),system);
- name = jzgUserInfo.getName();
- workNumber = jzgUserInfo.getWorkNumber();
- province = jzgUserInfo.getProvince();
- }else{
- name = byId.getUsername();
- }
- }
- //获取用户角色权限标识
- List<SysRolePerms> userPerms = sysUserRoleService.getUserPerms(byId.getId(), system);
- List<JzgGrantedAuthority> authorities = userPerms.stream()
- .map(perms -> new JzgGrantedAuthority(perms.getSysCode(),perms.getPermsId(),perms.getPerms()))
- .collect(Collectors.toList());
- //APP 是手机端,不进行权限校验
- if(!authorities.stream().anyMatch(x->x.getSystem().equals(system)) && !username.equals("admin") && !StringUtils.equals("APP",system)){
- throw new SystemException("没有权限访问系统");
- }
- SysUserJzgVo jzgUserInfo = new SysUserJzgVo();
- //获取用户头像
- if(SystemConstants.SYSTEM_JZG_APP.getCode().equals(system)){
- SysUser user = sysUserService.getById(byId.getId());
- if(!Objects.isNull(user.getHeadSculpture()) && !user.getHeadSculpture().isEmpty()) {
- jzgUserInfo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", user.getHeadSculpture()));
- }
- }else if(SystemConstants.SYSTEM_PLATFORM.getCode().equals(system)){
- SysUser user = sysUserService.getById(byId.getId());
- if(!Objects.isNull(user.getHeadSculpture()) && !user.getHeadSculpture().isEmpty()) {
- jzgUserInfo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", user.getHeadSculpture()));
- }
- }else{
- jzgUserInfo = sysUserService.getJzgUserInfo(byId.getId(),system);
- if(!Objects.isNull(jzgUserInfo.getHeadSculpture()) && !jzgUserInfo.getHeadSculpture().isEmpty()) {
- jzgUserInfo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", jzgUserInfo.getHeadSculpture()));
- }
- }
- //角色数据权限
- List<String> roleIds = userPerms.stream().map(x -> x.getRoleId()).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
- //设置角色数据权限
- SysRoleDataScopeVo sysRoleDataScopeVo = new SysRoleDataScopeVo();
- if (!CollectionUtils.isEmpty(roleIds)){
- List<SysRoleDataScope> sysRoleDataScopes = sysRoleDataScopeMapper.selectList(new LambdaQueryWrapper<SysRoleDataScope>()
- .in(SysRoleDataScope::getRoleId, roleIds));
- if(!username.equals("admin") && !SystemConstants.SYSTEM_PLATFORM.getCode().equals(system)) {
- String dataMark = "";
- List<String> dataDeptIds = new ArrayList<>();
- if (sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("2")).count() > 0) {
- dataMark = "2";
- sysRoleDataScopeVo.setDataMark("2");
- } else {
- List<SysRoleDataScope> dataScopes = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("1")).collect(Collectors.toList());
- dataDeptIds.add(jzgUserInfo.getDeptId());
- if (!dataScopes.isEmpty()) {
- sysRoleDataScopeVo.setDataMark("1");
- sysRoleDataScopeVo.setDeptIds(dataDeptIds);
- }
- List<SysRoleDataScope> dataScopes3 = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("3")).collect(Collectors.toList());
- List<String> dataScopeLinkRoleIds = dataScopes3.stream().map(x -> x.getRoleId()).collect(Collectors.toList());
- if(!dataScopeLinkRoleIds.isEmpty()) {
- List<SysRoleDataScopeLink> sysRoleDataScopeLinks = sysRoleDataScopeLinkMapper.selectList(new LambdaQueryWrapper<SysRoleDataScopeLink>()
- .in(SysRoleDataScopeLink::getRoleId, dataScopeLinkRoleIds));
- List<String> deptIds = sysRoleDataScopeLinks.stream().map(x -> x.getDeptId()).collect(Collectors.toList());
- sysRoleDataScopeVo.setDataMark("3");
- sysRoleDataScopeVo.setDeptIds(deptIds);
- }
- }
- }
- }
- java.util.Map<String, Object> detailMap = new java.util.HashMap<>();
- detailMap.put("systemcode", system);
- detailMap.put("deptId",jzgUserInfo.getDeptId());
- detailMap.put("dataScope",sysRoleDataScopeVo);
- detailMap.put("name",name);
- detailMap.put("workNumber",workNumber);
- detailMap.put("id",byId.getId());
- detailMap.put("username",byId.getUsername());
- detailMap.put("headSculpture",jzgUserInfo.getHeadSculpture());
- detailMap.put("isFirst",isFirst);
- if (!province.equals("")) {
- SysArea sysArea = sysAreaMapper.selectOne(new LambdaQueryWrapper<SysArea>().eq(SysArea::getAreaCode, province));
- detailMap.put("province",sysArea.getAreaCname());
- } else {
- detailMap.put("province","");
- }
- details = detailMap;
- Object finalDetails = details;
- return new UsernamePasswordAuthenticationToken(username, rawPassword, authorities) {{
- setDetails(finalDetails);
- }};
- }
- @Override
- public boolean supports(Class<?> authentication) {
- return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
- }
- private static AlipayConfig getAlipayConfig() {
- String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmb0GfNv7ex5SmUiBnMn3szFP4XM5c8KnYll6HGoFCQTxwMSVYq652ELBtGAScqV9QOVcF/1Z1NF+a0AabGd0qSKKsPOhHNg3vG4yHHs4gwOdqFxwjATXqgHaZXSIQGnoPUJ3J05AlYLlinm9oOoTAY68880pM9h9d7t4Aq4WqVfnGteNaV5+oaV/KgX2OGo7m3WPR+e5Yjl9xxYXjVF1Uv7hznNER74KuYhRP44759lgfo0RlncGXuaygKHoxCpKTozGmvedP0hTO/WJTEi5l11Gp4mfMN9Gb/VtjsRDJaCFMmXU19UcHOFxyFOrKoyNYxdj3ue07/l51l4+8TVyJAgMBAAECggEBAJGR09qW9nsSIxEJ2e+I+RzpZjRfr9sYX+XhN1KBuzag6mTSh3Cz0IbReA4jKL2BYq0/Sb8kIpGmukwk0PJNv+Rg3W86YosOW0ecV+BC8FUzg/SFvAVd5LNzosfm7okZL1M/1pKVaYlXvS3ll1mZfUzso3Py8zS3PJ4i86ewXdupp2HcQt8c5O57lkzdhi35a38k9RrrSsYgnUClAMFWvmN4x1v7vuddzW0/q5Ztg1k9Ukz209dMOIc5cZ8+zyX5PO0rEofUETMtF5D5N2qtsMsMlDxvYq7aQoNq5I1p8e2mjZv5U7EvkLENTZmPRtAdddut1LGACU0AAlvvOOgu9wECgYEA27Q/EuQPfFh/aOYyi6zq0AWFN2U+tN/y3/nAvGymisdp6c2q1s6ESvENJep7v9PR/cownHKIllTJbzh03DKrQd0LYJrh4CFr6xv5DSUXMft5+6Te+t1FpULqhtkVLcqqTSqMRo8Yl/QMDxI6mRd4pmEFscOIEW+5lzyofxfL7mECgYEAwe4hNIyz2b/uBCCUMPA8CL8kJILqw0ZHB4EekoLugqYHAi3LPCDpJzFJ3pcZXjUdH9TUKQp67eizk+xedfFdicm0ENzPqCoUPidT88QZImaP8uP2LblTlxNCDf8D15BQzBHDlTDN+2tzFi7qAb3v2mgK5U9WGOOkicmMGzv8jykCgYARP3hIKmFQ2L2/5XqIXp3ckOJhc/BVUNOHY9sOr9TvRjJ5aW0FChd2rq/ijyMB70YoD2x7i75PVv6tXZhHBS9Or2TKQ76B0v3e6kZGEuhcQyrTZ6EdvqtOCw/QYFB6VNPD1RhIHcnHfCBKOpshE6ekIC/LQdd3zvaZ+egceijHYQKBgDgN250z2jxjZKnevNbUaZXhodHH4ZGl+5vor2yL2eL7mGUB1Y/At4OzlHV5WUTIt21e+CAQvm2L6HQmSztuE6pjGeAR4xfpacZ5WaPJF7bAzHTZfWvD+KxfTaV8A6FIPoJt1AmIfNFiQna0AsGUJAMONbAIWYuCKSoGjq/EjADZAoGAS0ZaZdPKKQnd4g/lqM8CnHTfhW11ANP/rPZDU+NvjW2jQ6SIdJhwJaKMEQCcDp63j0SADlghzrvm+KMbnTrFqTHlAizcFxnOOOxO1pKXKuOJWWsyNBN33suB3XPFrsobEtmtnWyvph1GoAZOX457RN5LSmBTbqpbyEsjKg/W1zc=";
- String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArP+St5P9dLhPmm/ggf3jPDc2552wu/+91QSAzlEqRSrdWAIwrHcntM0VY/4/+39Z8h44/0TBNTb0j1gdWrCyb+1ENxwwgCqs7f8C/5gClTQCcoNys4MtGAAM7BbNp/LzmswOuPTOMtjlUBArWFvJDgDoSQJ8vGwGHgRcLsSLPwlhwVdnqVbq60CI185U/yZgNITTCGpDXv5bnQQ26GrUbH+5Qm4fYmT2B/2ijAVJUYq+EaBMOyv+AD8C1+CtXcgH86+g13MdD1T8cw5nkV9/4fcPIWD8R1aj20C1+kCMujaydB4yDpHiqQcQEtJoVbZJk5MYp8JcctqDT01brVct5wIDAQAB";
- AlipayConfig alipayConfig = new AlipayConfig();
- alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
- alipayConfig.setAppId("2021004153668213");
- alipayConfig.setPrivateKey(privateKey);
- alipayConfig.setFormat("json");
- alipayConfig.setAlipayPublicKey(alipayPublicKey);
- alipayConfig.setCharset("UTF-8");
- alipayConfig.setSignType("RSA2");
- return alipayConfig;
- }
- }
|