在Authentication—JdbcRealm验证一篇,我们使用数据库作为数据源配置用户名和密码,进行身份认证。本篇我们使用数据库作为数据源为用户配置角色和权限,通过Shiro自带的JdbcRealm进行认证和授权。先前通过JdbcRealm源码,我们知道JdbcRealm是从users表中获取到用户相关信息,同样查看信息,我们可以知道JdbcRealm从user_roles获取用户角色,从roles_permissions获取与角色相关联的权限。
因此我们先创建这两张表,并且插入一些数据:如下
CREATE TABLE `roles_permissions` (
`id` int(11) NOT NULL,
`permission` varchar(255) DEFAULT NULL,
`role_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `roles_permissions` (`id`, `permission`, `role_name`) VALUES ('1', 'user:add', 'role1');
INSERT INTO `roles_permissions` (`id`, `permission`, `role_name`) VALUES ('2', 'user:delete', 'role1');
INSERT INTO `roles_permissions` (`id`, `permission`, `role_name`) VALUES ('3', 'user:update', 'role2');
CREATE TABLE `user_roles` (
`id` int(11) DEFAULT NULL,
`role_name` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user_roles` (`id`, `role_name`, `username`) VALUES ('1', 'role1', 'pharos');
INSERT INTO `user_roles` (`id`, `role_name`, `username`) VALUES ('2', 'role2', 'pharos');
因为Shiro默认使用IniRealm,所以同样我们需要在[main]部分配置JdbcRealm,这里不再需要[roles]部分和[users]部分,配置如下:
[main]
dataSource = com.alibaba.druid.pool.DruidDataSource
dataSource.url = jdbc:mysql://localhost:3306/shiro
dataSource.username= root
dataSource.password = 123456
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $dataSource
securityManager.realm=$jdbcRealm
之后的测试代码就与Authorization—权限控制流程一样,这里不再重复复制粘贴代码。