zoukankan      html  css  js  c++  java
  • shiro(三),使用第三方jdbcRealm连接数据库操作

    这里采用第三方实现好的JdbcRealm连接数据库;首先来看一下源码;

    接着前面的说;就把这个类当做我们自己写的就好了,我们需要实例化它,然后给他注入一个数据源

    下面是ini文件配置

    [main]
    #采用第三方JdbcRealm连接数据库
    jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
    
    #实例化数据源
    dataSource=com.alibaba.druid.pool.DruidDataSource
    
    #设置参数
    dataSource.driverClassName=com.mysql.jdbc.Driver
    dataSource.url=jdbc:mysql://localhost:3306/shiro
    dataSource.username=root
    dataSource.password=root
    
    #将数据源设置到realm中
    jdbcRealm.dataSource=$dataSource
    jdbcRealm.permissionsLookupEnabled=true
    securityManager.realms=$jdbcRealm

    下面是sql脚本;大家测试可以直接复制去数据库执行

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : localhost_3306
    Source Server Version : 50527
    Source Host           : localhost:3306
    Source Database       : shiro
    
    Target Server Type    : MYSQL
    Target Server Version : 50527
    File Encoding         : 65001
    
    Date: 2018-03-30 22:31:17
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `roles_permissions`
    -- ----------------------------
    DROP TABLE IF EXISTS `roles_permissions`;
    CREATE TABLE `roles_permissions` (
      `id` int(11) NOT NULL DEFAULT '0',
      `role_name` varchar(20) DEFAULT NULL,
      `permission` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of roles_permissions
    -- ----------------------------
    INSERT INTO `roles_permissions` VALUES ('1', 'system', 'update');
    
    -- ----------------------------
    -- Table structure for `users`
    -- ----------------------------
    DROP TABLE IF EXISTS `users`;
    CREATE TABLE `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(20) DEFAULT NULL,
      `password` varchar(20) DEFAULT NULL,
      `password_salt` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of users
    -- ----------------------------
    INSERT INTO `users` VALUES ('1', 'admin', '666', null);
    
    -- ----------------------------
    -- Table structure for `user_roles`
    -- ----------------------------
    DROP TABLE IF EXISTS `user_roles`;
    CREATE TABLE `user_roles` (
      `id` int(11) NOT NULL DEFAULT '0',
      `username` varchar(20) DEFAULT NULL,
      `role_name` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user_roles
    -- ----------------------------
    INSERT INTO `user_roles` VALUES ('1', 'admin', 'system');

    下面是测试代码

    package com;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.HostAuthenticationToken;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.session.Session;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    
    /**
     * 测试shiro第一个案例
     *
     */
    public class App 
    {
        public static void main( String[] args )
        {
    
                /*实例化工厂*/
                Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
               /*获取实例*/
                SecurityManager securityManager = factory.getInstance();
                /*设置参数*/
                SecurityUtils.setSecurityManager(securityManager);
                /*获取登录实例*/
                Subject subject = SecurityUtils.getSubject();
                /*实例化token,传入登录的用户和密码*/
                UsernamePasswordToken token = new UsernamePasswordToken("admin", "666");
                subject.isAuthenticated();
    
                try {
                    /*进行登录*/
                    subject.login(token);
                    System.out.println("登录成功!!");
                    if (subject.hasRole("system")){
                       System.out.println("拥有该角色");
                   }else {
                       System.out.println("没有该角色");
                   }
    
                   if (subject.isPermitted("update")){
                        System.out.println("拥有该权限");
                    }else {
                       System.out.println("没有该权限");
                   }
                    /*退出登录*/
                    subject.logout();
                }catch (Exception e){
                    System.out.println("登录错误!!");
                }
    
        }
    }

    需要依赖文件请点击此处链接http://www.cnblogs.com/qq376324789/p/8640651.html

    下面的代码是将ini文件彻底转换为java代码

    package com;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.realm.jdbc.JdbcRealm;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    
    public class TestShiro {
    
    
        public static void main(String[] args) {
            
            Factory<SecurityManager> factory = new IniSecurityManagerFactory();
            SecurityManager instance = factory.getInstance();
            JdbcRealm realm = new JdbcRealm();
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("mysql://localhost:3306/shiro");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            realm.setDataSource(dataSource);
            realm.setPermissionsLookupEnabled(true);
            SecurityUtils.setSecurityManager(instance);
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken("admin", "666");
            subject.login(token);
    
    
        }
    }
  • 相关阅读:
    征战蓝桥 —— 2015年第六届 —— C/C++A组第3题——奇妙的数字
    征战蓝桥 —— 2015年第六届 —— C/C++A组第3题——奇妙的数字
    征战蓝桥 —— 2013年第四届 —— C/C++A组第6题——逆波兰表达式
    征战蓝桥 —— 2013年第四届 —— C/C++A组第6题——逆波兰表达式
    征战蓝桥 —— 2013年第四届 —— C/C++A组第6题——逆波兰表达式
    信息学奥赛一本通(C++)在线评测系统——基础(三)数据结构 —— 1354:括弧匹配检验
    信息学奥赛一本通(C++)在线评测系统——基础(三)数据结构 —— 1354:括弧匹配检验
    C#通过反射对可空类型动态赋值的问题
    网段
    C#通过反射对可空类型动态赋值的问题
  • 原文地址:https://www.cnblogs.com/qq376324789/p/8679054.html
Copyright © 2011-2022 走看看