正常做项目校验用户和权限都需要经过这几步:
(1)、校验用户的账号密码,校验失败给用户的提示
(2)、用户密码校验成功后的操作
(3)、用户在操作某个方法时校验用户是否有这个方法的权限,如果没有权限给与提示
security是一个权限校验框架,对以上这些功能都提供了相应的接口,我们只需要实现这些接口即可;
本文最后链接会有一个demo,使用了mysql、redis,大致逻辑是用户在登录时校验账号密码,校验成功则查询用户拥有的方法权限封装成一个对象放在redis中(键是userId),然后使用jwt对userId加密生成token返回给客户端,用户做其他操作的时候将token传到服务端,服务端解析token获得userId,然后根据userId从redis中获得用户的方法权限,然后检验当前用户访问的方法;
我以下面的项目简单说明一下登录流程:
首先启动 SanGengTokenDemo,使用postMan等工具访问:http://localhost:8888/user/login
Security的配置类SecurityConfig,配置一些全局的配置;
1、 在login方法中将 用户和密码封装成UsernamePasswordAuthenticationToken,然后调用 authenticate 方法 校验用户的账号密码、查询用户的权限封装成 LoginUser,在这一步中我们需要实现 UserDetailsService的 loadUserByUsername 接口 用于 校验账号密码、查询用户权限;
2、获得用户信息后使用JWT将userId 生成token 返回客户端,并将 loginUser 放入到redis中;
3、校验用户或账号密码失败的接口 AuthenticationEntryPoint.commence ,我们只需要实现这个方法并在 SecurityConfig 配置,校验失败时就会执行
4、权限校验失败的接口 AccessDeniedHandler.handle,我们只需要实现这个方法并在 SecurityConfig 配置,用户没有方法权限时就会执行
5、方法权限的校验
(1)、security 提供了四种权限校验方法,是在方法上面添加注解实现,参考 HelloController 中的 hello 方法,一般不使用这种方式,一个方法通常要被很多个角色访问,这种配置很繁琐
(2)、在全局过滤器中 从 loginUser 中获得用户拥有的权限,判断是否包含当前的url;
根据用户查询用户信息:
校验密码:根据注入的passwordEncoder来进行密码的校验,passwordEncoder是在SecurityConfig中注入的BCryptPasswordEncoder,所以数据库中存储的也是加密后的密码,如:passwordEncoder.encode("1234"),见MapperTest;
学习视频地址:SpringSecurity框架教程-Spring Security+JWT实现项目级前端分离认证授权-B站最通俗易懂的Spring Security课程_哔哩哔哩_bilibili
下面附件是实现的demo及方法调用:
代码链接:https://pan.baidu.com/s/1XzcHKWs7pIcBydLiRlazAA?pwd=ps1r
数据库脚本:链接:https://pan.baidu.com/s/1RCIM330FsrPbFzyGXB5hqA?pwd=dq9p