LoginController类

具体代码
/*** 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类

具体代码

@Resource
private AppAuthenticationProvider authenticationManager;/*** 登录验证** @param username 用户名* @param password 密码* @return 结果*/public String login(String username, String password) {// 用户验证Authentication authentication;try {// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = 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());// 生成tokenreturn tokenService.createToken(loginUser);}
AppAuthenticationProvider 类

具体代码

@Component
public class AppAuthenticationProvider implements AuthenticationProvider {private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);@Autowiredprivate AppUserDetailsServiceImpl userDetailsService;@SneakyThrows@Overridepublic 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();// 构建返回的用户登录成功的tokenreturn new UsernamePasswordAuthenticationToken(userInfo, userInfo.getPassword(), authorities);}@Overridepublic boolean supports(Class<?> authentication) {
//        return authentication.equals(UsernamePasswordAuthenticationToken.class);// 这里直接改成 return true;表示是支持这个执行return true;}}
AppUserDetailsServiceImpl类

具体代码

@Service
public class AppUserDetailsServiceImpl implements UserDetailsService {private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);@Autowiredprivate IProductMemberService memberService;//自己写的接口@Autowiredprivate IProductMemberCourtService memberCourtService;@Overridepublic 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")

如图:

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

千万千万要添加!!!

下图中的LongUser类要添加东西

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

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

以下内容可作为参考:

登录认证JWTtoken验证机制

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

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

安全配置:定义了基本的配置信息
framework.config.SecurityConfigUserDetailsServiceImpl 用户验证处理类登录接口的服务类
framework.web.service.SysLoginServiceJWT拦截器,拦截令牌并校验信息
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
{@Autowiredprivate TokenService tokenService;@Overrideprotected 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)


getRouters 获取前端页面路由信息
这个接口完全为前端准备,后面会专门讲述前端的权限控制

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

  1. PHP开发B2C商城 微信小程序商城系统源码+数据库,轻量级前后端分离的电商系统,支持微信小程序 + H5+ 公众号 + APP

    项目介绍 一款轻量级.高性能.前后端分离的电商系统,支持微信小程序 + H5+ 公众号 + APP,前后端源码完全开源,看见及所得,完美支持二次开发,可学习可商用,让您快速搭建个性化独立商城. 完整代 ...

  2. 若依前后端分离发布富文本框内容 | uni-app微信小程序展示富文本框内容

    微信小程序端引入富文本样式 富文本提交图片json error 一.展示示例: 1.PC端前端发布界面 可以设置文字大小,居中,可以插入图片,设置图片大小,居中. 2.小程序端展示 二.基于若依框架踩 ...

  3. Ruoyi-Vue若依前后端分离版 2022年5月 基于代码生成器的新模块添加

    Ruoyi-Vue若依前后端分离版 2022年5月 基于代码生成器的新模块添加 在ruoyi数据库的基础上.编辑好自己的数据库表 启动ruoyi前后端,进系统使用代码生成器 将生成的代码导入到现有的项 ...

  4. 若依前后端分离版数据库已经存在的字典添加一条后刷新没作用,必须清除Redis缓存

    场景 使用若依的前后端分离版,前端下拉框的使用直接查询的是字典表中的数据. 对于某个类型的字典如果之前已经添加过并使用过,后来想要再添加一条此类型的字典. 在数据库中添加后,前端刷新下,发现没有获取到 ...

  5. 若依前后端分离版获取部门表所有最子级部门并匹配部门名称生成excel

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在上面 ...

  6. 若依权限系统分析(前后端分离版)

    若依权限系统分析 一:故事背景 二:具体权限控制 2.1 页面权限控制 2.2 页面元素权限控制 三:实现前端鉴权 3.1 封装js与权限交互 3.1.1 uni-app自带uni-request与权 ...

  7. 使用SpringBoot + Vue (若依前后端分离版) 写项目的一些总结(持续更新...)

    使用SpringBoot + Vue(若依前后端分离版) 写项目的一些总结 获取Redis服务 @Autowired private RedisCache redisCache; String cap ...

  8. 若依前后端分离版怎样去掉登录验证码

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依前后端分离版本的配置 上面在 ...

  9. 若依前后端分离版手把手教你本地搭建环境并运行项目

    场景 RuoYi-Vue是一款基于SpringBoot+Vue的前后端分离极速后台开发框架. RuoYi 官网地址:http://ruoyi.vip RuoYi 在线文档:http://doc.ruo ...

最新文章

  1. ossweb上传 php_php - ftp 上传文件到远程服务器
  2. Matlab 二维绘图函数(plot类)
  3. 热电偶校验仪_热电偶校验方法_电厂系列之热控仪表装置校验讲解
  4. 小程序 --- 项目小练手Ⅰ
  5. Android中DisplayMetrics 获取手机屏幕分辨率
  6. Spark Streaming和Flume集成指南V1.4.1
  7. 从“卡脖子”到“主导”,国产数据库 40 年的演变!
  8. python 读取bin文件
  9. mysql 字段加减_Mysql数据清洗—Null值的处理技巧
  10. 施密特:下个千亿美元市值公司将出在哪个行业
  11. 四轴飞控DIY Mark4 - RTH/GPS Rescure
  12. IT大学生成长周报 | 第 1 期
  13. 一键排班软件开发心得
  14. Windows系统下的Git安装教程
  15. cs1.6服务器修改游戏类型,如何自己架设CS1.6服务器?
  16. Inside-OutsideNet
  17. (二)U盘安装Windows Server 2008 R2系统
  18. java网络编程 TCP程序
  19. 「经济读物」小狗钱钱
  20. 国产操作系统调研 -- 银河麒麟4.0.2

热门文章

  1. HDMI/type-c一线通EDP驱动板|应用高清便携显示器支持2K/1080P
  2. 盘点微软使用火热的编程语言!程序员:你看我还有机会吗?
  3. “PHP语言,是全世界最好用的编程语言!“
  4. 有可以在家做的赚钱兼职吗?
  5. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
  6. 极客兔兔 TensorFlow入门教程
  7. 证券期货经营机构私募资产管理业务管理办法 2018年10月22日
  8. 如何比较两个文本的相似度
  9. 电子行业测试软件,CAM软件技术在电子行业的应用测试验证
  10. 尚硅谷《全套Java、Android、HTML5前端视频》