1. 程式人生 > >Shiro(三)——Shiro自定義Realm

Shiro(三)——Shiro自定義Realm

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");
		
	}
	
}

執行成功