Shiro内置Realm——JdbcRealm

本文介绍了如何使用Apache Shiro框架结合JDBC Realm进行用户登录认证和权限验证。通过配置数据源、创建用户、角色及权限表,并设置Shiro查询权限表,演示了登录、角色验证及权限检查的过程。示例代码展示了如何处理权限不足导致的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值