若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法

这篇具有很好参考价值的文章主要介绍了若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LoginController类

基于若依开发app登录接口,java,小程序,前端

具体代码 
/**
     * app 登录
     */
    @AnonymousAccess
    @PostMapping("login")
    public AjaxResult login(@RequestBody LoginBody loginBody) {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword());
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }

登录校验 ——AppLoginService类

基于若依开发app登录接口,java,小程序,前端

 具体代码

@Resource
private AppAuthenticationProvider authenticationManager;

  /**
     * 登录验证
     *
     * @param username 用户名
     * @param password 密码
     * @return 结果
     */
    public String login(String username, String password) {
        // 用户验证
        Authentication authentication;
        try {
            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager
                    .authenticate(new UsernamePasswordAuthenticationToken(username, password));
        } 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());
            }
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        recordLoginInfo(loginUser.getUserId());
        // 生成token
        return tokenService.createToken(loginUser);
    }
AppAuthenticationProvider 类

基于若依开发app登录接口,java,小程序,前端

 具体代码

@Component
public class AppAuthenticationProvider implements AuthenticationProvider {

    private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);

    @Autowired
    private AppUserDetailsServiceImpl userDetailsService;

    @SneakyThrows
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String userName = authentication.getName();// 这个获取表单输入中返回的用户名;
        Object password = authentication.getCredentials();//这个获取表单输入中返回的密码;

        // 这里构建来判断用户是否存在和密码是否正确
        UserDetails userInfo = userDetailsService.loadUserByUsername(userName); // 这里调用我们的自己写的获取用户的方法;

        if(!SecurityUtils.matchesPassword(password.toString(),userInfo.getPassword())){
            log.info("用户不存在/密码错误,{}", userName);
            throw new ServiceException("用户不存在/密码错误");
        }        

        Collection<? extends GrantedAuthority> authorities = userInfo.getAuthorities();
        // 构建返回的用户登录成功的token
        return new UsernamePasswordAuthenticationToken(userInfo, userInfo.getPassword(), authorities);
    }

    @Override
    public boolean supports(Class<?> authentication) {
//        return authentication.equals(UsernamePasswordAuthenticationToken.class);
        // 这里直接改成 return true;表示是支持这个执行
        return true;
    }

}
AppUserDetailsServiceImpl类

基于若依开发app登录接口,java,小程序,前端

 具体代码

@Service
public class AppUserDetailsServiceImpl implements UserDetailsService {

    private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);

    @Autowired
    private IProductMemberService memberService;//自己写的接口

    @Autowired
    private IProductMemberCourtService memberCourtService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        ProductMember member = memberService.selectUserByUserName(username);//验证登录用户

        if (StringUtils.isNull(member)) {
            log.info("登录用户:{} 不存在.", username);
            throw new ServiceException("登录用户:" + username + " 不存在");
        } else if (UserStatus.DELETED.getCode().equals(member.getDelFlag())) {
            log.info("登录用户:{} 已被删除.", username);
            throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
        } else if (UserStatus.DISABLE.getCode().equals(member.getStatus())) {
            log.info("登录用户:{} 已被停用.", username);
            throw new ServiceException("对不起,您的账号:" + username + " 已停用");
        }

        return createLoginUser(member);
    }

    public UserDetails createLoginUser(ProductMember member) {
        return new LoginUser(member.getMemberId(), memberCourtService.selectCourtIdByMemberId(member.getMemberId()), member);
    }
}

此时运行时,会有冲突!!!

需要在 xxx-framework/src/main/java/....../SecurityConfig中条件

    @Qualifier("userDetailsServiceImpl")

如图:

基于若依开发app登录接口,java,小程序,前端

 此时启动项目不会报冲突的错

千万千万要添加!!!

下图中的LongUser类要添加东西

基于若依开发app登录接口,java,小程序,前端

基于若依开发app登录接口,java,小程序,前端

 要在public String getPassword(){}中添加自己写的登录实体类的getPassword()

以上内容已经可以解决app和小程序新的登录接口方案和后台管理的登陆获取token不冲突

以下内容可作为参考:

登录认证JWTtoken验证机制

后端部分
/login 接口
userName
password
code 验证码
前端获取上面三个要素后调用接口,整体改接口做了下面几件事情

1、验证用户身份(账号密码+验证码)
2、生成token
3、保存用户登录态到spring security中

安全配置:定义了基本的配置信息
framework.config.SecurityConfig

UserDetailsServiceImpl 用户验证处理类

登录接口的服务类
framework.web.service.SysLoginService

JWT拦截器,拦截令牌并校验信息
framework.security.filter.JwtAuthenticationTokenFilter


详细过程

1、SysLoginService 中调用UserDetailsServiceImpl校验用户的密码是否匹配以及用户账户状态,校验通过后返回UserDetails实例,该实例包含了用户的基本信息和菜单权限信息
2、调用tokenService.createToken(loginUser)生成token
令牌生成的详细过程

生成uuid随机数,这个随机数用来做rediskey存储token
生成一个token(无时效)
拦截到的token如果距离失效在10分钟以内(可配置)就自动刷新有效期

前面提到了token本身无时效,有效期是通过redis控制的,因为jwt本身未提供刷新有效期的方法(可能是我不知道)。

以上用户调用了login接口并且获得了token

jwt令牌校验
 

/**
 * token过滤器 验证token有效性
 * 
 * @author sj
 */
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
{
    @Autowired
    private TokenService tokenService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
        {
            tokenService.verifyToken(loginUser);
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        }
        chain.doFilter(request, response);
    }
}


代码比较短,所以就直接贴出来,这段代码拦截了所有请求并且完成了令牌的校验和刷新,具体过程如下

1、tokenService.getLoginUser(request); 从request中获取token并校验,如果校验通过就返回LoginUser对象
2、校验LoginUser的token,如果再刷限期内就直接刷新
3、将LoginUser封装到SecurityContextHolder中作为全局的用户登录状态


注:第3条有两个好处

1、后续拦截器发现SecurityContextHolder中保存了用户时,就直接通过校验
2、通过SecurityContextHolder可以快速获取当前请求的登录信息。
以上基本上已经说名了JWT校验的基本过程,忽略了很多细节

getInfo 获取用户信息
1、用户的基本信息
2、用户所有的Permissions(菜单树)
3、用户所有的RopePersmission(roleKeys)

基于若依开发app登录接口,java,小程序,前端
getRouters 获取前端页面路由信息
这个接口完全为前端准备,后面会专门讲述前端的权限控制

 基于若依开发app登录接口,java,小程序,前端文章来源地址https://www.toymoban.com/news/detail-729530.html

到了这里,关于若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于若依前后端分离框架的小程序的token验证

    后端和管理端都用的若依框架。 但是前段的小程序需要微信授权登录。这时候就需要在若依框架上重新再起一套token验证。 首先创建两个类(只要放在你能够引用得到的位置就可以): 第一个:实体 第二个service: 下一步: 找到 com.ruoyi.framework.security.filter; 这个文件 添加你

    2024年02月11日
    浏览(32)
  • 若依前端问题集合[前后端分离版本]

    目录 1.若依前后端分离页面改变title 1.修改icon 2.修改title文字 2.若依关闭Login页面验证码 1.关闭验证码 登录杂项 3.若依前端替换代理地址 4.侧边菜单和全局样式 1.侧边菜单 2.侧边栏顶部logo替换或删除 3.全局样式 修改背景色 修改浏览器title和icon图标 在项目 public 文件夹中有

    2024年02月07日
    浏览(32)
  • 【若依】框架:第01讲前后端分离项目

    介绍 | RuoYi         将下载好的若依项目导入IDEA,导入后配置MAVEN环境,等待下载完成。重点关注ruoyi-admin和ruoyi-system两个文件夹,前者放controller,后者放实体类、mapper、service ①打开文件夹选择若依前端项目(ruoyi-ui)文件夹 ②信任此作者进入 ③重点关心src文件夹下的api和

    2023年04月08日
    浏览(36)
  • 若依前后端分离项目docker部署

    1.centos 7 2.docker 3.mysql5.x 8.x 4.redis 5.nginx 前往 Gitee 下载页面(https://gitee.com/y_project/RuoYi-Vue (opens new window))下载解压到工作目录 3.1 后端 1.下载代码到本地后,解压完成,用idea打开项目 2.创建数据库:ry-vue 3.在创建好数据库后,运行以下两个sql文件生成数据表(quartz.sql、ry_202208

    2024年02月05日
    浏览(32)
  • 若依项目的介绍(前后端分离版本)

    目录 一、若依介绍 (一)简单介绍  (二)若依版本 (三)Git远程拉取步骤  二、项目的技术介绍 (一)后端技术 1.spring boot 2.Spring Security安全控制 3.MyBatis 4.MySQL和Redis (二)前端技术 1.vue 2.vue-router 3.axios  4.element-ui 5.node 6.ES6 7.Nginx反向代理服务器 三、项目结构介绍 1.总体

    2024年02月12日
    浏览(34)
  • 若依前后端分离版集成nacos

            根据公司要求,需要将项目集成到nacos中,当前项目是基于若依前后端分离版开发的,若依的版本为3.8.3,若依框架中整合的springBoot版本为2.5.14。Nacos核心提供两个功能:服务注册与发现,动态配置管理。 1、引入pom依赖 2、bootstrap.yml配置 3、添加注解 在项目启动类

    2023年04月12日
    浏览(26)
  • 若依使用及源码解析(前后端分离版)

    部署环境 JDK = 1.8 MYSQL = 5.7 Maven = 3.0 Node = 12 Redis = 3 运行若依项目 下载若依源码  若依官网 若依项目源码(前后端分离) 运行后端项目  ruoyi-ui就是vue项目(这里使用vscode打开)   整体用idea打开 1.配置数据库(sql提供sql文件中的sql脚本配置) 创建数据库 ruoyi_vue数据库并导入qua

    2024年02月07日
    浏览(26)
  • 从零入门开源框架---若依(前后端分离版)

    一、若依是什么? 若依它就是一个开源项目,别人写好的代码,我们拿来进行二次开发,它主要是做数据和权限管理系统。 二、使用背景 任何公司的各种大的项目必然需要一个后台权限管理系统,这是必然的,但是如果不想投入太多人力物力去开发,又恰好有现成且比较好用

    2024年02月02日
    浏览(27)
  • 四、若依(前后端分离)项目构建docker 镜像

    修改配置文件参数,数据库ip和账号密码 修改端口号,这个修改不修改都无所谓,docker run时端口映射时修改也可以的 redis ip和端口修改 输入目录 rz 上传

    2024年02月10日
    浏览(33)
  • 【学习】若依源码(前后端分离版)之 “ 异常处理”

    通常一个web框架中,有大量需要处理的异常。比如业务异常,权限不足等等。前端通过弹出提示信息的方式告诉用户出了什么错误。 通常情况下我们用try…catch…对异常进行捕捉处理,但是在实际项目中对业务模块进行异常捕捉,会造成代码重复和繁杂, 我们希望代码中只有

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包