package com.xiangshuai.test;
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.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
/**
* pow.xml如下
* <?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">
<parent>
<artifactId>xiangshuai-shiro</artifactId>
<groupId>com.xiangshuai</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shiro-test</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<!-- shiro核心包 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<!--JdbcReals需从数据库获取数据 mysql连接驱动 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!-- JdbcReals需从数据库获取数据 数据库连接池 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
</project>
文件在
E:\学习文档子目录压缩\框架\shiro\shiro安全框架入门\复习步骤4-获取权限数据JdbcRealm提供subject桥梁 - 数据库用户权限角色等信息\shiro-test.rar
或 E:\学习文档子目录压缩\框架\shiro\shiro安全框架入门\复习步骤4-获取权限数据JdbcRealm提供subject桥梁 - 数据库用户权限角色等信息\shiro-test.rar
* */
public class JdbcRealmTest {
DruidDataSource dataSource=new DruidDataSource();
{
dataSource.setUrl("jdbc:mysql://localhost:3306/shiro");
dataSource.setUsername("root");
dataSource.setPassword("password");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
}
@Test
public void testJdbcRealmTest(){
//新建Real 从数据源中获取信息到Real中
JdbcRealm jdbcRealm = new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
//jdbcRealm.setPermissionsLookupEnabled(true);//开启查权限的开关,默认为false
/* 点进 JdbcRealm 可见,JdbcReal默认从数据源中 已下表中获取 验证,权限数据等的
protected static final String DEFAULT_AUTHENTICATION_QUERY = "select password from users where username = ?";
protected static final String DEFAULT_SALTED_AUTHENTICATION_QUERY = "select password, password_salt from users where username = ?";
protected static final String DEFAULT_USER_ROLES_QUERY = "select role_name from user_roles where username = ?";
protected static final String DEFAULT_PERMISSIONS_QUERY = "select permission from roles_permissions where role_name = ?";
*/
//设置JdbcRealm从我们自己定义的表中查查数据
String userSql= "select password from t_users where username = ?";
jdbcRealm.setAuthenticationQuery(userSql);//验证查询SQL--不从默认表users中查,查询某用户是否经过验证
String userRoleSql= "select rolename from t_user_roles where username = ?";
jdbcRealm.setUserRolesQuery(userRoleSql);//用户角色查询SQL--不从默认表user_roles中查,某用户是不是某个角色
String rolePermissionsSql= "select permissionname from t_roles_permissions where rolename = ?";
jdbcRealm.setPermissionsLookupEnabled(true);//要是jdbcRealm有访问操作roles_permissions角色权限表,需设为true,默认为false 否则会报 Subject does not have permission [user:select]
//角色权限查询SQL--不从默认表roles_permissions中查,某角色赋予了具有哪些权限
jdbcRealm.setPermissionsQuery(rolePermissionsSql);
//创建SecurityManger环境,手动添加个Reals到创建SecurityManger环境中
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(jdbcRealm);
//主体Subject主动提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
// 给subject主体里面加 登录token
UsernamePasswordToken token = new UsernamePasswordToken("王小米","123");
subject.login(token);
//Reals 对subject和数据库(这里事模拟的)进行比对,看是否能通过验证 --true
System.out.println("subject是否通过认证:"+subject.isAuthenticated());
System.out.println("subject是否有角色:"+subject.hasRole("sjy"));//subject是否有sjy权限
subject.checkPermissions("user:select");// 如果subject 没有同时没有含user和admin角色 会报 Subject does not have role [user] 这个错
}
}
项目结构如下: