前段时间简单了解了一下springsecurity,自建demo尝试了一下,本来是为了读某开源项目源码而做的技术储备。结果,又被一些杂七杂八的事情打乱了计划,由于用得少接触的浅,很快springsecurity在我的记忆中模糊了。
但是这种权限管理的框架还是有必要学一个的,斟酌了一下,最终选择了shiro。主要原因是通过网上调研发现shiro比springsecurity更容易上手,在b站上找了一套教程听了一遍,了解了其中一些概念和流程,然后开始上手操作。
由于没记住框架的一些类名和方法名,所以又找了一份教程作为辅助,目标是实现一个简单的登录认证,用户名和密码暂时不加密存储在数据库中,自定义realm进行读取数据。
首先,自定义了realm,扩展的是AuthorizingRealm,实现了认证和授权需要用到的两个方法。将自定义的realm对象传给securityManager,将securityManager传给过滤器工厂,采用的技术是springboot+mybatis+shiro+druid连接池,没想到的是项目居然起不来,起初我怀疑是配置文件的问题,毕竟好久没配置yml了,可能会有些疏忽。经过了一番折腾,项目依旧起不来,此时心态已接近崩溃边缘。下午的时候再仔细一看,居然忘记引入mysql-connector-java依赖,果然是太久没配置了,犯了这种愚蠢的错误。
果断补全依赖,结果项目依然跑不起来,启动类没有放在最外层目录下,但是我特意加了ComponentScan注解进行扫描,看了一下报错信息,发现原因出在所有的Mapper都没有被扫描到(记得之前整合没出现过这种情况啊?),在使用了@MapperScan后,它终于跑起来了。
毕竟是初学shiro,本着一切从简的原则将用户角色权限全都塞进了一张表,本以为这一次应该是没什么问题了。使用postman发送了一个post请求居然认证失败???
本来打算断点跟一下,查看取出的用户名和密码,结果发现断点居然走不到持久层???
于是,写了一个接口测试了一下获取用户信息的代码,得到的结果是正确的。又注释掉从数据库读取的代码,暂时修改为写死的数据,发现这一次是可以验证通过的。
最终发现,原来@Autowired没有成功将我的service注入进realm,失策了,又没好好看报错信息... ...
最后找到的解决方案是在配置类中生成自定义realm实例对象的方法上加上@Bean注解即可。
最终几经周折总算是实现了一个用户认证功能,丝毫高兴不起来,看来有必要回头搞本书来好好学一下shiro。