Shiro(三)——Shiro自定義Realm
阿新 • • 發佈:2018-12-31
Realm: 域。Shiro 從從 Realm 獲取安全資料(如使用者、角色、許可權),就是說 SecurityManager 要驗證使用者身份,那麼它需要從 Realm 獲取相應的使用者進行比較以確定使用者身份是否合法;也需要從 Realm 得到使用者相應的角色 / 許可權進行驗證使用者是否能進行操作;可以把 Realm 看成 DataSource,即安全資料來源。
一、內建Realm
內建Realm分為兩種,IniRealm和JdbcReaml。
1.1、IniReaml
package first.ShiroTest; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.text.IniRealm; import org.apache.shiro.subject.Subject; import org.junit.Test; public class IniRealmTest { @Test public void testAuthentication1() { IniRealm iniRealm = new IniRealm("classpath:user.ini"); //1、構建SecurityManager環境 //安全管理器。即所有與安全有關的操作都會與SecurityManager互動 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(iniRealm); //2、主體提交認證請求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject();//獲取主體 UsernamePasswordToken token = new UsernamePasswordToken("Mark", "123456");//提交認證 subject.login(token); System.out.println("是否認證:"+subject.isAuthenticated()); subject.checkRole("admin"); subject.checkPermission("user:update"); } }
user.ini
[users]
Mark=123456,admin
[roles]
admin=user:delete,user:update
執行單元測試,通過:
1.2 JdbcRealm
通過JDBC連線資料庫
package first.ShiroTest; 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; import com.alibaba.druid.pool.DruidDataSource; public class JdbcRealmTest { DruidDataSource dataSource = new DruidDataSource(); { dataSource.setUrl("jdbc:mysql://此處填寫IP地址:3336/shiro_test"); dataSource.setUsername("此處填寫賬號"); dataSource.setPassword("此處填寫密碼"); } //Shiro認證 @Test public void testAuthentication1() { JdbcRealm jdbcRealm = new JdbcRealm(); jdbcRealm.setDataSource(dataSource); jdbcRealm.setPermissionsLookupEnabled(true);//需要設定許可權開關,預設是關閉的 String sql = "select password from test_user where username = ?";//自定義sql jdbcRealm.setAuthenticationQuery(sql); String roleSql = "select role_name from test_user_role where user_name = ?"; jdbcRealm.setUserRolesQuery(roleSql); String permissionSql = "select permission from test_role_permission where role = ?"; jdbcRealm.setPermissionsQuery(permissionSql); //1、構建SecurityManager環境 //安全管理器。即所有與安全有關的操作都會與SecurityManager互動 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(jdbcRealm); //2、主體提交認證請求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject();//獲取主體 UsernamePasswordToken token = new UsernamePasswordToken("kimi", "654321");//提交認證 subject.login(token); System.out.println("是否認證:"+subject.isAuthenticated()); subject.checkRole("user"); subject.checkPermission("user:select"); } }
執行成功