复习步骤4-获取权限数据JdbcRealm提供subject桥梁 - 数据库用户权限角色等信息

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangshuai198807/article/details/88864953

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 没有同时没有含useradmin角色 会报 Subject does not have role [user] 这个错


   
}

}

 

项目结构如下:

 

猜你喜欢

转载自blog.csdn.net/xiangshuai198807/article/details/88864953