美文网首页Java程序员首页投稿(暂停使用,暂停投稿)
JavaWeb日记——Shiro从数据库获取身份信息

JavaWeb日记——Shiro从数据库获取身份信息

作者: 饥渴计科极客杰铿 | 来源:发表于2017-04-26 08:45 被阅读186次

    上两篇Shiro的认证要么写死在ini里,要么写死在realm里,这样很不灵活,开发过程中,角色和权限都是写在数据库里的,这时就需要用到JdbcRealm

    JdbcRealm的用法十分简单,只要表名,表结构符合要求即可

    先执行sql语句创建数据库,数据表和填充数据

    drop database if exists shiro;
    create database shiro;
    use shiro;
    
    create table users (
      id bigint auto_increment,
      username varchar(100),
      password varchar(100),
      password_salt varchar(100),
      constraint pk_users primary key(id)
    ) charset=utf8 ENGINE=InnoDB;
    create unique index idx_users_username on users(username);
    
    create table user_roles(
      id bigint auto_increment,
      username varchar(100),
      role_name varchar(100),
      constraint pk_user_roles primary key(id)
    ) charset=utf8 ENGINE=InnoDB;
    create unique index idx_user_roles on user_roles(username, role_name);
    
    create table roles_permissions(
      id bigint auto_increment,
      role_name varchar(100),
      permission varchar(100),
      constraint pk_roles_permissions primary key(id)
    ) charset=utf8 ENGINE=InnoDB;
    create unique index idx_roles_permissions on roles_permissions(role_name, permission);
    
    insert into users(username, password, password_salt) values('jack', '123456', null);
    insert into user_roles(username, role_name) values('jack', 'role1');
    insert into user_roles(username, role_name) values('jack', 'role2');
    insert into roles_permissions(role_name, permission) values('role1', 'user1:*');
    insert into roles_permissions(role_name, permission) values('role1', 'user2:*');
    insert into roles_permissions(role_name, permission) values('role2', 'user3:*');
    
    

    POM

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.jk.shiroLearning</groupId>
        <artifactId>chapter3</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.9</version>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.1.3</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-core</artifactId>
                <version>1.2.2</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.25</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>0.2.23</version>
            </dependency>
    
    
        </dependencies>
    
    </project>
    

    因为要用到数据库,所以要引入mysql-connector-java,还要引入druid作为连接池

    Shiro.ini

    [main]
    authorizer=org.apache.shiro.authz.ModularRealmAuthorizer
    securityManager.authorizer=$authorizer
    
    #自定义realm 一定要放在securityManager.authorizer赋值之后(因为调用setRealms会将realms设置给authorizer,并给各个Realm设置permissionResolver和rolePermissionResolver)
    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
    jdbcRealm.dataSource=$dataSource
    jdbcRealm.permissionsLookupEnabled=true
    securityManager.realms=$jdbcRealm
    
    

    验证登录和身份信息

    public class TestJdbcRealm {
        public static void main(String[]args){
            //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
            Factory<SecurityManager> factory =
                    new IniSecurityManagerFactory("classpath:shiro.ini");
    
            //2、得到SecurityManager实例 并绑定给SecurityUtils
            org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
            SecurityUtils.setSecurityManager(securityManager);
    
            //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken("jack", "123456");
    
            try {
                //4、登录,即身份验证
                subject.login(token);
                //验证是否有user1的create权限
                System.out.println(subject.isPermitted("user1:create:*"));
                //验证是否有role1角色
                System.out.println(subject.hasRole("role1"));
            } catch (AuthenticationException e) {
                //5、身份验证失败
                e.printStackTrace();
            }
            //6、退出
            subject.logout();
        }
    }
    

    JdbcRealm使用起来十分方便,只需传入帐号密码,认证和授权的方法都帮你实现好了

    源码地址https://github.com/jkgeekJack/shiro-learning/tree/master/chapter3

    相关文章

      网友评论

        本文标题:JavaWeb日记——Shiro从数据库获取身份信息

        本文链接:https://www.haomeiwen.com/subject/fdtizttx.html