Shiro 学习记录(三)--简单的 授权

shiro简单的授权

需要引入的依赖

<dependency>
   <groupId>org.apache.shiro</groupId>
   <artifactId>shiro-core</artifactId>
   <version>1.3.2</version>
</dependency>
<!--  shiro-core 依赖于这个依赖    -->
<dependency>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
   <version>1.1</version>
</dependency>

1,基本的认证(从配置文件中获取用户和权限信息来模拟从数据库中的获取)

1.1,shiro-resources.ini配置文件的配置

[users]
zhangsan=123,role1
wangwu=123,role2

[roles]
role1=user:create
role2=user:*

1.2,简单的测试代码

/**
 *   简单的授权
 * @author wangmx
 */
public class TestAuthorize1 {
	
	public static void main(String[] args) {
		//简单的授权需要先认证 在授权
		
		//认证
		
		//创建安全管理器
		IniSecurityManagerFactory iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro/shiro-resources.ini");
		SecurityManager securityManager = iniSecurityManagerFactory.getInstance(); 
				
		//告诉安全工具类,使用哪一个安全管理器
		SecurityUtils.setSecurityManager(securityManager);
				
		//获取主体
		Subject subject = SecurityUtils.getSubject();
				
		//认证状态
		boolean flag = subject.isAuthenticated();
		System.out.println("认证状态: "+flag);
				
		//认证主体携带数据
		AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123");
		try {
			subject.login(token);
			System.out.println("当前认证成功!");
		}catch (UnknownAccountException e) {
			// TODO: handle exception
			System.out.println("账户错误!");
		}catch (IncorrectCredentialsException e) {
			// TODO: handle exception
			System.out.println("密码错误!");
		}
				
		flag = subject.isAuthenticated();
		System.out.println("认证状态: "+flag);
		
		//授权
		if(subject.isAuthenticated()) {
			//基于角色权限
			//判断当前用户是否有此角色
			boolean hasRole1 = subject.hasRole("role1");
			if(hasRole1) {
//				System.out.println("当前用户有role1的权限");
			}
			
			//判断当前用户是否包含某个角色
			boolean[] hasRoles2 = subject.hasRoles(Arrays.asList("role1","role2","role3"));
			for (boolean b : hasRoles2) {
//				System.out.println("判断当前用户是否包含某个角色:"+b);
			}
			
			//判断当前用户是否包含所以的角色
			boolean hasAllRoles3 = subject.hasAllRoles(Arrays.asList("role1","role2","role3"));
//			System.out.println("判断当前用户是否包含所以的角色"+hasAllRoles3);
			
//			基于权限标识符的权限控制
			boolean permitted1 = subject.isPermitted("user:create");
//			System.out.println("基于权限标识符的权限控制:"+permitted1);
			
//			判断用户是否具分别有某个角色
			boolean[] permitted2 = subject.isPermitted("user:create:001","user:delete","product:create");
			for (boolean b : permitted2) {
//				System.out.println("判断用户是否分别具有某个角色:"+b);
			}
			
//			当前用户是否包含所以角色
			boolean permittedAll1 = subject.isPermittedAll("user:create:001","user:delete","product:create");
			System.out.println("当前用户是否包含所以角色:"+permittedAll1);
			
		}
		
	}

}

2,从数据库中获取用户信息和角色信息(权限标识符)

2.1,还是先看shiro-resources2.ini配置文件的配置,主要就是配置自定义realm和配置安全管理器以及配置凭证匹配器

#配置凭证匹配器
hashedCredentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
hashedCredentialsMatcher.hashAlgorithmName=md5
hashedCredentialsMatcher.hashIterations=1024

#配置自定义realm   自定义realm的地址com.wangmx.shiroAutorizer.PermissionRealm
myrealm=com.wangmx.shiroAutorizer.PermissionRealm
myrealm.credentialsMatcher=$hashedCredentialsMatcher
#配置安全管理器
securityManager.realm=$myrealm

2.2,自定义realm 和只有认证不一样 继承 AuthorizingRealm  实现doGetAuthorizationInfo和doGetAuthenticationInfo方法doGetAuthorizationInfo主要是授权的方法 返回值类型为AuthorizationInfo,doGetAuthenticationInfo是认证的方法返回值为AuthenticationInfo

简单的自定义realm的编写

/**
 * 从数据库中查找数据 认证 并且授权
 * @author wangmx
 */
public class PermissionRealm extends AuthorizingRealm{
	
//  授权
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		// TODO Auto-generated method stub
		
		String primaryPrincipal = (String)principals.getPrimaryPrincipal();
		System.out.println("授权primaryPrincipal:"+primaryPrincipal);
		//查询数据库
                //User user = dao.queryUser("primaryPrincipal ");
                //dao.queryRole(user.getUserId());  
                //这里 admin 和 user:add 我没有从数据库中查询 这个可以从数据库中 查询出来
		SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
		
		//可根据自己需要的去选择 角色还是 权限标识符
		//角色
		simpleAuthorizationInfo.addRole("admin");
		
		//权限标识符(资源表示)
		simpleAuthorizationInfo.addStringPermission("user:add");
		
		return simpleAuthorizationInfo;
	}
	
//  认证
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
		// TODO Auto-generated method stub
		
		String principal = (String)authenticationToken.getPrincipal();
		System.out.println("认证Realm:"+principal);
                //User user = dao.queryUser("principal");
                // wangwu和3d53b73c485f523ef2fe45f2b8dd3c58 可以从user.getUserName()和user.getPassWord()中获取
		if(principal.equals("wangwu")) {
			return new SimpleAuthenticationInfo("wangwu","3d53b73c485f523ef2fe45f2b8dd3c58",ByteSource.Util.bytes("ABCD"),this.getName());
		}
		
		return null;
	}

}

2.3,简单的测试代码 进行测试用户的认证和授权模拟 Controller

/**
 *   授权 在数据库中取数据
 * @author wangmx
 */
public class TestAuthorize2 {
	
	public static void main(String[] args) {
		//简单的授权需要先认证 在授权
		
		//认证
		
		//创建安全管理器
		IniSecurityManagerFactory iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro/shiro-resources2.ini");
		SecurityManager securityManager = iniSecurityManagerFactory.getInstance(); 
				
		//告诉安全工具类,使用哪一个安全管理器
		SecurityUtils.setSecurityManager(securityManager);
				
		//获取主体
		Subject subject = SecurityUtils.getSubject();
				
		//认证状态
		boolean flag = subject.isAuthenticated();
		System.out.println("认证状态: "+flag);
				
		//认证主体携带数据
		AuthenticationToken token = new UsernamePasswordToken("wangwu", "123456");
		try {
			subject.login(token);
			System.out.println("当前认证成功!");
		}catch (UnknownAccountException e) {
			// TODO: handle exception
			System.out.println("账户错误!");
		}catch (IncorrectCredentialsException e) {
			// TODO: handle exception
			System.out.println("密码错误!");
		}
				
		flag = subject.isAuthenticated();
		System.out.println("认证状态: "+flag);
		
		//授权
		if(subject.isAuthenticated()) {
			//验证角色
			boolean hasRole = subject.hasRole("admin");
			System.out.println("验证角色:"+hasRole);
			
			//验证权限标识符
			boolean permitted = subject.isPermitted("user:add");
			System.out.println("验证权限标识符:"+permitted);
		}
		
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值