前言
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
此文章在有一定的SpringSecurity基础的看,包括Springboot+SpringSecurity+JWT+Redis进行整合。
记得把之前拦截器注释掉,它已经是过去时了。说实话刚开始学确实摸不懂头脑,但是学完自己写出来就感到无比的喜悦,这可能就是自己选择这么方向的原因吧。加油兄弟们。
项目更改地方
SpringSecurity
- pom.xml
1 | xml复制代码<dependency> |
- SecurityConfig
1 | java复制代码@EnableWebSecurity |
- 增加一张表role和user和role多对多表
role 主键 id 和一个 varchar 的name ,必须加ROLE_
user_role 主键id和两个外键分别对应user和role表
4. 实体类user修改
继承Security的UserDetails接口。如果不用的话会报错,框架就不认咱们的实体类还是默认框架自己的实体类。实现接口中的方法注意点默认的四个false改为true
1 | java复制代码@Data |
- 自定义登录逻辑UserDetailsServiceImpl继承UserDetailsService接口
这里逻辑非常简单,就是从数据库查数据。通过username判断用户(password在框架中封装,由于我的数据库的数据没有进行加密,所以我查出来数据进行了加密),对象为空就可以抛出UsernameNotFoundException
异常,这是肯定要有的。
查询权限表SELECT * from m_role where id in (select roleid FROM m_userrole where userid = #{userid})
查到名下所有权限,拿出路径用,号分割拼成字符串,然后用AuthorityUtils.commaSeparatedStringToAuthorityList()
进行分割存入user对象中。把当前user存入线程以便后续用到,返回user对象此处user必须继承过UserDetails的对象。
1 | java复制代码@Service |
- 登录loginController
只是一个简单的api调用方法即可没有多余判断语句。重点在于之前我这里有注解@RequestBody,不知道为什么我加入了security之后总是报错null,有懂得同学谢谢解答一下。
1 | java复制代码@RestController |
UserService中login实现 。首先要问自己如果不用框架应该怎么写呢?
1 | java复制代码 @Override |
我们会直接从数据库里去查找此人是否存在就可以判定。而现在我们需要去实现框架验证登录逻辑获取user对象UsernamePasswordAuthenticationToken
通过用户生成authentication
,然后authenticationManager
.authenticate()
对特定的authentication
进行认证功能,认证成功后的Authentication
就变成授信凭据,并触发认证成功的事件。认证失败的就抛出异常触发认证失败的事件。其中authenticationManager
还会调用我们自定义的UserDetailsServiceImpl
进行判定。看到这是不是脑袋里有思路了,我建议多打几个断点
去跟这断点走这样理解更深。
7. Filter
UsernamePasswordAuthenticationToken判断用户是否经过认证,SecurityContextHolder.getContext().setAuthentication()授权用户,将返回Authentication 对象赋予给当前的 SecurityContext。
1 | java复制代码@Component |
测试
- 测试登录
- 每次都会经过这个自定义登录方法
- 和之前jwt一样获取资源还是header加token
- 权限不足,如果要用
Authorization
记得在配置文件改一下token.header=Authorization
总结
通过代码可以发现我代码里有很多的System.out.println("-**************login");
虽然已经删除了很多了。这是我在代码出错或者要看到那个方法执行以及方法中某个对象或者变量值都是用这个方法进行判断,不知道好不好但是多起来就难受了
我看看到很多都是用log所以下一步整合日志框架。
其实并不难,就看自己下不下劲了。我看连写将近一周时间把他搞完,至少看了三个完整视频,五篇以上相关文章,而且还没有看源码,中间出现了很多错误不知道为什么很多网上都没有相关问题。重点还是在于登录逻辑,这只是框架的第二种密码登录模式还是比较简单的。
欢迎大家指导批评
本文转载自: 掘金