JdbcRealm需要引入数据库驱动和数据源
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.14</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
我们自己的自定义SQL,但是我比较懒,就按照这些SQL来创建数据表。
创建下面三张表,SQL文件在案例文件中
用户表:
权限表:
用户表与权限表的关系表
代码:
public static void main(String[] args) {
//假数据
String username = "hello";
String password = "123456";
//配置数据源
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/shiro?useSSL=false&serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
//用JdbcRealm读取数据库中的用户、角色、权限信息
JdbcRealm jdbcRealm = new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
jdbcRealm.setPermissionsLookupEnabled(true);//为了查询权限表,要开启权限查询
//1:构建securityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(jdbcRealm);
//2:主体提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
//3:登录(Shiro接管了登录功能),如果传入的账号密码和simpleAccountRealm对象的不同则会账号或密码错误的异常
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
//3:检查当前用户是否有指定权限,检查对当用户是不是指定角色
subject.checkPermissions("user:save", "user:update","user:delete");
subject.checkRoles("admin");
//查看认证结果
System.out.println("认证结果:" + subject.isAuthenticated());
}
必须设置允许shiro查询权限表,否则在查询权限的时候无论有没有该权限都会抛异常:
jdbcRealm.setPermissionsLookupEnabled(true);//为了查询权限表,要开启权限查询
当前的登录认证、角色验证是成功的,权限验证时因为没有“user:delete”,会报错
删除掉“user:delete”这个检查条件后,认证就ok了
SQL:
/*Table structure for table `roles_permissions` */
DROP TABLE IF EXISTS `roles_permissions`;
CREATE TABLE `roles_permissions` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`role_name` varchar(32) NOT NULL COMMENT '角色名称',
`permission` varchar(32) NOT NULL COMMENT '角色权限',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='角色表';
/*Data for the table `roles_permissions` */
insert into `roles_permissions`(`id`,`role_name`,`permission`) values
(1,'member','user:list'),
(2,'member','user:update'),
(3,'admin','user:update'),
(4,'admin','user:save'),
(5,'admin','user:list'),
(6,'superAdminRole','user:update'),
(7,'superAdminRole','user:delete'),
(8,'superAdminRole','user:save'),
(9,'superAdminRole','user:list');
/*Table structure for table `user_roles` */
DROP TABLE IF EXISTS `user_roles`;
CREATE TABLE `user_roles` (
`id` bigint(2) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '账号',
`role_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户与角色关系表';
/*Data for the table `user_roles` */
insert into `user_roles`(`id`,`username`,`role_name`) values
(1,'hello','admin');
/*Table structure for table `users` */
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '账号',
`password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表';
/*Data for the table `users` */
insert into `users`(`id`,`username`,`password`) values
(1,'hello','123456');