本文介绍: 1、 在控制器层,SysLoginController 中,原有的login方法之后,写一个登录的方法,注意其中的 loginService.logingcy(userId);通过第三方协议解析用户信息,可能 是工号,或者是微信openid这都无所谓,反正通过他你能找到本系统用户可以了。在项目中,前后端分离的若依项目需要通过统一认证,或者是第三方协带认证信息跳转到本系统的指定页面。1、首先要做一个登录过度页面内容可以为空白,只需要接收地址栏中的参数,并且调用上面第一步中定义的方法。

项目中,前后端分离的若依项目需要通过统一认证,或者是第三方协带认证信息跳转到本系统的指定页面需要前后端都做相应的改造,由于第一次实现时已过了很久,再次重写时,发现还是搞了很长时间,所以花点时间整理出事,也方便给大家参考。

首先明确需要处理几个部分:

一、后端的处理

       1、 在控制器层,SysLoginController  中,原有的login方法之后,写一个登录的方法,注意其中的 loginService.logingcy(userId); 这个是下一步要实现的。通过第三方协议解析出用户的信息,可能 是工号,或者是微信openid这都无所谓,反正通过他你能找到本系统的用户就可以了。

 @GetMapping("/logingcy")
    public AjaxResult logingcy(String ssouser)
    {
        AjaxResult ajax = AjaxResult.success();

        try {
            //通过中间的协议解析出用户的基本信息
            String[] userInfo = JasmineSsoUtil.getUserInfo(ssouser, Constants.SSODOMAIN, Constants.SSOKEY);
            String userId = userInfo[0];
            //以下为获取此员工的待办工单数量,并按要求返回值
            System.out.println("useris "+userId);
            String token =   loginService.logingcy(userId);
            ajax.put(Constants.TOKEN, token);
            return ajax;

        } catch (Exception e) {


            e.printStackTrace();
        }
        return AjaxResult.error();
        // 生成令牌

    }

2、在登录服务中增加一个和原来登录对应的方法 SysLoginService   loginService.logingcy(userId);

/*
    通过工程翼用户登录

     */
    public String logingcy(String username)
    {
        // 用户验证
        Authentication authentication = null;

        SysUser sysUser = userService.selectUserByUserName(username);
        System.out.println("admin  staffcode is "+ username +" and password is "+sysUser.getPassword());
        try
        {
            //已经确认解析出用户信息,所以这里使用一个内部的特定密码和模拟密码进行检验
            userDetailsService.loadUserByUsername(username);
            UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, Constants.CPASSWORD);
                //AuthenticationContextHolder.setContext(token);
                // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager.authenticate(token);

        }
        catch (Exception e)
        {
            if (e instanceof BadCredentialsException)
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                throw new UserPasswordNotMatchException();
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
                throw new ServiceException(e.getMessage());
            }
        }
        finally
        {
          //  AuthenticationContextHolder.clearContext();
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        // 生成token
        return tokenService.createToken(loginUser);

    }

3、增加一个 SecurityProvider 用于密码和校检

具体的代码如下:

package com.ruoyi.framework.security.provider;

import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.service.ISysUserService;
import org.apache.poi.hssf.record.DVALRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

/**
 * 自定义认证服务
 * */
@Service("securityProvider")
public class SecurityProvider implements AuthenticationProvider {

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;
    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private ISysUserService userService;

    public SecurityProvider(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
     /*   UsernamePasswordAuthenticationToken token
                = (UsernamePasswordAuthenticationToken) authentication;*/
        String name = authentication.getName();
        String password = (String) authentication.getCredentials();
        System.out.println("name:"+name+"password:"+password);
        //这里直接判断异常
        UserDetails user = userDetailsService.loadUserByUsername(name);
        String encoderPassword = bCryptPasswordEncoder.encode(password);


        SysUser user1 = userService.selectUserByUserName("admin");
        user1.setPassword(SecurityUtils.encryptPassword("admin123"));
        userService.updateUser(user1);


        System.out.println("1password is "+    SecurityUtils.encryptPassword(password));
        System.out.println("2password is"+encoderPassword);

        System.out.println("user passwordis "+user.getPassword());




        // 数据库账号密码校验能通过就通过
        if (SecurityUtils.matchesPassword(password, user.getPassword())){
            //  if (bCryptPasswordEncoder.matches(password, user.getPassword())) {
           // log.info("使用账户密码登录");
            return new UsernamePasswordAuthenticationToken(user, encoderPassword);
        }

        //这里是第三方登录使用方式,用一个内部的密码代替了password的位置

       // log.info(""+checkValid);
        if(Constants.CPASSWORD.equalsIgnoreCase(password)){

            return new UsernamePasswordAuthenticationToken(user, password);
        } else {
            // 如果都登录不了,就返回异常输出
            throw new UserPasswordNotMatchException();
        }



    }

    @Override
    public boolean supports(Class<?> authentication) {
        //返回true后才会执行上面的authenticate方法,这步能确保authentication能正确转换类型
        return  true;
    }

}

4、修改配置文件  SecurityConfig 有两处需要修改,一个是最下面,使用上一步定义的SecurityProvider

一个是上面,允许前端的新登录页面可以直接访问

到此,后端部分的改造就完成了。

二、前端页面

1、首先要做一个登录过度页面,内容可以为空白,只需要接收地址栏中的参数,并且调用上面第一步中定义的方法

2、在路由配置路径对应访问的这个页面

3、设置白名单,可以直接访问页面

4、在原来的login.js写入后台对应的地址,这里注意需要先logou一下,防止重复登录报错

export function logingcy(ssouser) {
  logout();
  return request({
    url: '/logingcy?ssouser=' + ssouser,
    method: 'get',
  })
}

5、在user.js中增加一个action,这里需要写入token是关键,不然后台一直报未登录

原文地址:https://blog.csdn.net/wdwlbsm1/article/details/134568479

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_2940.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注