我是靠谱客的博主 炙热歌曲,最近开发中收集的这篇文章主要介绍Shiro内置JdbcRealm使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Shiro内置JdbcRealm使用

方式一:jdbcRealm.ini

  • 创建jdbcRealm.ini文件
#注意 文件格式必须为ini,编码为ANSI
#声明Realm,指定realm类型
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#配置数据源
#dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource=com.alibaba.druid.pool.DruidDataSource
# mysql-connector-java 5 用的驱动url是com.mysql.jdbc.Driver,mysql-connector-java6以后用的是com.mysql.cj.jdbc.Driver
dataSource.driverClassName=com.mysql.cj.jdbc.Driver
#避免安全警告
dataSource.url=jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
dataSource.username=xxx
dataSource.password=xxx
#指定数据源
jdbcRealm.dataSource=$dataSource
#注意!!!! 开启查找权限, 默认是false,不会去查找角色对应的权限
jdbcRealm.permissionsLookupEnabled=true
#指定SecurityManager的Realms实现,设置realms,可以有多个,用逗号隔开
securityManager.realms=$jdbcRealm
  • 使用
// 通过工厂创建SecurityManager
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbcRealm.ini");
        // 通过工厂获取securityManager环境
        SecurityManager securityManager = factory.getInstance();
        // 把securityManager进行注入
        SecurityUtils.setSecurityManager(securityManager);

        // 获取主体
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("jack","123");
        subject.login(token);
        System.out.println("认证状态:"+subject.isAuthenticated());
        System.out.println("是否具有role1角色:"+subject.hasRole("role1"));
        System.out.println("是否具有good:buy权限:"+subject.isPermitted("good:buy"));
        // 检查权限
//        subject.checkPermission("good:add");
        System.out.println("获取用户名:"+subject.getPrincipal());

方式二:声明式

  • 创建jdbc数据源
// 连接数据库
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false");
ds.setUsername("xxx");
ds.setPassword("xxx");
  • 使用
@Test
 public void testAuthenticator2(){

     // 创建securityManager环境
     DefaultSecurityManager securityManager = new DefaultSecurityManager();

     // 连接数据库
     DruidDataSource ds = new DruidDataSource();
	ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
	ds.setUrl("jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false");
	ds.setUsername("xxx");
	ds.setPassword("xxx");

     // 创建数据域
     JdbcRealm jdbcRealm = new JdbcRealm();
     // 设置可以获取权限
     jdbcRealm.setPermissionsLookupEnabled(true);
     jdbcRealm.setDataSource(ds);

     // 将jdbcRealm注入securityManager中
     securityManager.setRealm(jdbcRealm);

     // 把securityManager进行注入
     SecurityUtils.setSecurityManager(securityManager);

     // 获取主体
     Subject subject = SecurityUtils.getSubject();
     UsernamePasswordToken token = new UsernamePasswordToken("jack","123");
     subject.login(token);
     System.out.println("认证状态:"+subject.isAuthenticated());
     System.out.println("是否具有role1角色:"+subject.hasRole("role1"));
     System.out.println("是否具有good:buy权限:"+subject.isPermitted("good:buy"));
     // 检查权限
//        subject.checkPermission("good:add");
     System.out.println("获取用户名:"+subject.getPrincipal());

 }

注意,使用内置JdbcRealm时,表结构需要与其默认的保持一致,否则可能无法找到相应的信息

  • 表结构(仅供参考)
CREATE TABLE `roles_permissions` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(100) DEFAULT NULL,
  `permission` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_roles_permissions` (`role_name`,`permission`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_roles` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL,
  `role_name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_user_roles` (`username`,`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL,
  `password` varchar(100) DEFAULT NULL,
  `password_salt` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_users_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述

最后

以上就是炙热歌曲为你收集整理的Shiro内置JdbcRealm使用的全部内容,希望文章能够帮你解决Shiro内置JdbcRealm使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部