Shiro内置Realm - JdbcRealm

说明:该方法通过数据库对用户、角色和权限进行验证

一. 使用 JdbcRealm 默认配置

解释:当没有自定义数据库语句时,会使用 JdbcRealm 这个对象中默认的数据库表和字段,如果连接的数据库不存在这些表、字段和数据时,同样无法通过认证

package com.example.controller;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

public class JdbcRealmTest {
    /**
     * @Description MySQL数据源设置
     */
    DruidDataSource dataSource = new DruidDataSource();
    {
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useUnicode=true&serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
    }

    @Test
    public void test() {
        // 1. 创建JdbcRealm对象
        JdbcRealm jdbcRealm = new JdbcRealm();
        // 1.1 设置JDBC环境
        jdbcRealm.setDataSource(dataSource);
        // 1.2 设置权限查找开关,默认为false,如果不设置则不会查询权限设置
        jdbcRealm.setPermissionsLookupEnabled(true);

        // 2. 构建SecurityManage环境,设置域
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(jdbcRealm);

        // 3. 提交主体认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();

        // 4. 模拟用户
        UsernamePasswordToken token = new UsernamePasswordToken("Mark","123");

        // 5. 登录
        subject.login(token);
        // 5.1 验证是否认证
        System.out.println(subject.isAuthenticated());

        // 6. 验证角色
        subject.checkRoles("admin");

        // 7. 验证权限
        subject.checkPermission("user:delete");
    }
}

二. 自定义查询语句 - 自定义用户查询语句

// 1.3 自定义SQL语句
String sql = "select password from user where user_name = ?";
jdbcRealm.setAuthenticationQuery(sql);
package com.example.controller;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

public class JdbcRealmTest {
    /**
     * @Description MySQL数据源设置
     */
    DruidDataSource dataSource = new DruidDataSource();
    {
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useUnicode=true&serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
    }

    @Test
    public void test() {
        // 1. 创建JdbcRealm对象
        JdbcRealm jdbcRealm = new JdbcRealm();
        // 1.1 设置JDBC环境
        jdbcRealm.setDataSource(dataSource);
        // 1.2 设置权限查找开关,默认为false,如果不设置则不会查询权限设置
        jdbcRealm.setPermissionsLookupEnabled(true);
        // 1.3 自定义SQL语句
        String sql = "select password from user where user_name = ?";
        jdbcRealm.setAuthenticationQuery(sql);

        // 2. 构建SecurityManage环境,设置域
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(jdbcRealm);

        // 3. 提交主体认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();

        // 4. 模拟用户
        UsernamePasswordToken token = new UsernamePasswordToken("xiaoming","123");

        // 5. 登录
        subject.login(token);
        // 5.1 验证是否认证
        System.out.println(subject.isAuthenticated());
    }
}

三. 测试结果 - OK