我们今天使用SpringBoot来整合SpringSecurity,来吧,不多BB
首先呢,是一个SpringBoot 项目,连接数据库,这里我使用的是mybaties.mysql, 下面是数据库的表
DROP TABLE IF EXISTS `xy_role`;
CREATE TABLE `xy_role` (
`xyr_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`xyr_name` char(30) DEFAULT NULL COMMENT '角色名称',
PRIMARY KEY (`xyr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='角色';
/*Data for the table `xy_role` */
insert into `xy_role`(`xyr_id`,`xyr_name`) values
(1,'ROLE_SUPERADMIN'),
(2,'网站管理员'),
(3,'ROLE_SHOPADMIN');
DROP TABLE IF EXISTS `xy_webadmin`;
CREATE TABLE `xy_webadmin` (
`xywb_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`xywb_username` char(30) DEFAULT NULL COMMENT '用户名',
`xyr_id` int(11) DEFAULT NULL COMMENT '角色',
`xywb_password` char(50) DEFAULT NULL COMMENT '密码',
`xywb_registertime` bigint(20) DEFAULT NULL COMMENT '注册时间',
PRIMARY KEY (`xywb_id`),
KEY `FK_Reference_37` (`xyr_id`),
CONSTRAINT `FK_Reference_37` FOREIGN KEY (`xyr_id`) REFERENCES `xy_role` (`xyr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='网站管理员';
/*Data for the table `xy_webadmin` */
insert into `xy_webadmin`(`xywb_id`,`xywb_username`,`xyr_id`,`xywb_password`,`xywb_registertime`) values
(1,'haiwei',1,'123456',1983),
(2,'admin',3,'123456',1983),
(3,'admin1',2,'123456',NULL);
表创建完了之后呢, 我们就开始写代码了
我们要创建spring security 的配置文件, 因为代码太长,所以我就直接截图了, 小伙伴们不要想着COPY代码哦,要自己手写代码
然后是一个实现了UserDetialsServer的类
这个类主要是实现了loadUserByname方法, 然后我们可以在这个类中注入我们的service 或者直接mapper接口, 然后方法内部根据username获得该用户, 然后再获取这个用户的权限
该类实现了UserDetials 接口, 然后里面有用户对象, 角色对象(也可以是一个角色泛型的list集合)这个自定义的类实现了这个几个方法
最重要的是第一个方法, 他会吧当前用户的角色存起来, 只有两段代码 我就不多说了, 下面就是一些账户密码可不可用什么的。
再回头来说我们的loadUserByName方法, 我们把角色和用户都set到这个类里面,然后返回。
这个一步只是验证有没有这个用户,或者是这个账户能不能用
一个实现了AuthenticationProvider的类, 注入我们的CustmUserService, 然后从Authentication取得账号和密码,调用loadUserByName方法获得账户信息, 再和页面输入的密码进行比对, 如果不能用就抛异常, 如果能用的活,就把账户,账户密码, 账户权限(角色)构建成UsernamePasswordAuthenticationToken返回,
下面是我的登录页面代码
这就完成了登录功能, 小伙伴们,一定要先按照我的代码写。 然后再自己去写(因为有些东西说的不详细)
然后我们再看权限功能
/test1 是只有super_admin才能访问的, /test2 是只有shopping_admin才能访问的(是有缺点的)
当然这里的话 是这样写就行, 我们再看页面上的
这里其实是有坑的, 为什么呢, 我们debug查看hasRole的源码
在我标箭头的这里, 如果你网页上写的参数不带ROLE_的话,他会强制给你加上, 然后如果你数据库里面的角色是admin,网页里面写的也是admin, 在这个就会用admin和ROLE_admin 匹配, 然后就不行
我的解决方法目前有两种: 1.数据库里面的角色就加上ROLE_
2. 添加角色时加上ROLE_
还有个问题就是第一张图那个的hasRole不能加ROLE_, 如果加了就会报错, 第一个加了没错, 第二个加了就报错了