登錄認證:
注意,下面我是以連接orcal數據庫為例的依賴,如果各位同仁使用的是騎她數據庫,可以換成對應數據庫的依賴(數據源不用換)
Pom.xml增加依賴:
<!--引入連接orcal的jar包--> <!-- oracle驅動 --> <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc14 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc7</artifactId> <version>7.0.0</version> </dependency> <!--引入數據源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency>
新建名為JdbcRelamTes的t測試類:
JdbcRelamTest.java代碼:
package com.shiro.shiroframe; import com.alibaba.druid.pool.DruidDataSource; import org.apache.catalina.security.SecurityUtil; 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.jupiter.api.Test; public class JdbcRelamTest { DruidDataSource druidDataSource = new DruidDataSource(); { druidDataSource.setUrl("jdbc:oracle:thin:@localhost:1521:ORCL"); druidDataSource.setUsername("testyanshemiyue");//你的數據庫賬號 druidDataSource.setPassword("testhourumiyu");//你的數據庫密碼 } @Test public void JdbcRelamTest() { JdbcRealm jdbcRealm = new JdbcRealm(); jdbcRealm.setDataSource(druidDataSource); DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(jdbcRealm); SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("miyue", "houru"); subject.login(usernamePasswordToken); System.err.println(subject.isAuthenticated());//true } }
數據庫創建表users並插入一條測試數據:
運行java代碼:
如果賬號密碼正確打印結果為true,否則報錯
補充:問什么要建users表?
下面是JdbcRealm類的源碼:
在我們沒有自己創建Sql語句時JdbcRealm會使用她自己定義的SQL語句,所以我們就根據此建表測試即可
角色認證和權限認證:
首先我們在數據庫建立角色表和角色權限表並插入數據:
java代為:
package com.shiro.shiroframe; import com.alibaba.druid.pool.DruidDataSource; import org.apache.catalina.security.SecurityUtil; 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.jupiter.api.Test; public class JdbcRelamTest { DruidDataSource druidDataSource = new DruidDataSource(); { druidDataSource.setUrl("jdbc:oracle:thin:@localhost:1521:ORCL"); druidDataSource.setUsername("luzhanshi"); druidDataSource.setPassword("admin123"); } @Test public void JdbcRelamTest() { JdbcRealm jdbcRealm = new JdbcRealm(); jdbcRealm.setDataSource(druidDataSource); //開啟查詢權限的開關(默認是關閉的)否則Shiro是不會去查詢權限數據的 jdbcRealm.setPermissionsLookupEnabled(true); DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(jdbcRealm); SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("miyue", "houru"); //登錄認證 subject.login(usernamePasswordToken); System.err.println(subject.isAuthenticated());//true //角色認證:驗證miyue是否具有admin角色 subject.checkRole("admin"); //權限認證:驗證admin角色是否具有user:select權限 subject.checkRoles("admin","user"); subject.checkPermission("user:select"); } }
執行java代碼,驗證通過控制台不報錯,否則控制台報錯
JdbcRelam自定義SQL:
如果上面涉及到的三個表是我們自定義的表名,那就要我們自己修改SQL語句了:
1、如下圖我們按照上面建表的過程一樣,新建了三張和上面一樣,但是名字不一樣的表:
那么我們的對應的java代碼就要修改對應的SQL:代碼如下:
package com.shiro.shiroframe; 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.jupiter.api.Test; public class JdbcRelamTest { DruidDataSource druidDataSource = new DruidDataSource(); { druidDataSource.setUrl("jdbc:oracle:thin:@localhost:1521:ORCL"); druidDataSource.setUsername("luzhanshi"); druidDataSource.setPassword("admin123"); } @Test public void JdbcRelamTest() { JdbcRealm jdbcRealm = new JdbcRealm(); jdbcRealm.setDataSource(druidDataSource); //開啟查詢權限的開關(默認是關閉的)否則Shiro是不會去查詢權限數據的 jdbcRealm.setPermissionsLookupEnabled(true); //創建自定義SQL String sql ="SELECT PASSWORD FROM TESTUSER WHERE USERNAME=?"; String roleSql ="SELECT ROLE_NAME FROM Test_USER_ROLES WHERE USERNAME = ?"; String rolePermissionSql ="SELECT PERMISSION FROM TEST_ROLES_PERMISSIONS WHERE ROLE_NAME = ?"; jdbcRealm.setAuthenticationQuery(sql); jdbcRealm.setUserRolesQuery(roleSql); jdbcRealm.setPermissionsQuery(rolePermissionSql); DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(jdbcRealm); SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("miyue", "houru"); //登錄認證 subject.login(usernamePasswordToken); System.err.println(subject.isAuthenticated());//true // //角色認證:驗證miyue是否具有admin角色 subject.checkRole("admin"); // //權限認證:驗證admin角色是否具有user:select權限 subject.checkRoles("admin","user"); subject.checkPermission("user:select"); } }