自定义realm进行授权


自定义realm(已经完成了认证),只要看下面的授权部分就可以


package com.mo.shiro.realm;

import java.util.ArrayList;
import java.util.List;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 
 *	这是一个Realm
 *
 */
public class CustomRealm extends AuthorizingRealm  {

	
	//设置CustomRealm的名称
	public void setName(String name) {
		super.setName("customRealm");
	}
	
	//认证
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		
		//token是用户输入的
		//第一步:从token里面取出用户的身份信息
		String userCode = (String)token.getPrincipal();
		
		//第二步:拿着用户输入的userCode从数据库中查询是否存在该用户
		//...数据库
		/*模拟从数据库查询到密码,
		 * 这里是已经根据用户输入的账号在数据库查了,
		 * 已经是查得有该账户的存在,并将密码也查询出来了,
		 * 111就是该账户的密码
		*/
		String password = "123";
		
		
		//如果查询不到返回null
		
		//如果查询到返回认证信息AuthenticationInfo,AuthenticationInfo是一个接口
		SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(userCode, password, this.getName());
		
		
		return simpleAuthenticationInfo;
	}
	
	

	//授权
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		
		//从principals获取主身份信息
		//将getPrimaryPrincipal方法返回值转为真实值类型,因为上面用户的身份是String类型的
		String userCode = (String)principals.getPrimaryPrincipal();
		
		//根据身份信息获取权限信息
		//身份信息获取权限信息   需要从数据库中查询,在这里模拟是从数据库中查询
		List<String> permissions = new ArrayList<String>();
		permissions.add("user:create");
		permissions.add("items:add");
		//上面是模拟从数据库中查询 传入的用户 查询到这个用户存在两个权限信息
		
		//创建一个新的SimpleAuthorizationInfo,用于返回
		SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
		
		//将查询出来的权限信息,放进返回的simpleAuthorizationInfo中
		simpleAuthorizationInfo.addStringPermissions(permissions);
		
		return simpleAuthorizationInfo;
	}

}


写一个配置文件shiro.ini


[main]
customRealm=com.mo.shiro.realm.CustomRealm
securityManager.realms=$customRealm


在测试单元中将该设置文件,设置到当前的securityManager环境中

package com.mo.authorization;

import java.util.Arrays;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;
import org.apache.shiro.mgt.SecurityManager;
public class AuthorizationTest {

	@Test
	public void test1(){
		
	    //创建securityManager工厂,通过ini配置文件创建securityManager  
	    Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");  
	      
	    //通过factory工厂,创建securityManager  
	    SecurityManager securityManager = factory.getInstance();  
	      
	    //将securityManager设置当前的运行环境中  
	    SecurityUtils.setSecurityManager(securityManager);  
	      
	    //从SecurityUtils里面创建一个subject,subject就是主体  
	    Subject subject = SecurityUtils.getSubject();  
	      
	    //在认证提价前,准备token,token就是一个令牌,用户和密码  
	    UsernamePasswordToken token = new UsernamePasswordToken("zhang","123");  
	      
	    //执行认证的提交  
	    try {  
	        //执行认证的提交,认证不通过就会抛出异常  
	        subject.login(token);  
	    } catch (AuthenticationException e) {  
	        e.printStackTrace();  
	    }  
	      
	    //这是认证是否通过,返回的是boolean类型的数据类型  
	    boolean isAuthenticated = subject.isAuthenticated();  
	    System.out.println("是否认证通过"+isAuthenticated);  
		
	    
	    //认证成功进行授权

	    
	    //基于资源的授权,这个subject有没有这个资源的访问权限,返回的是boolean数据类型
	    boolean ishasPermitted = subject.isPermitted("user:create");
	    System.out.println("单个权限判断"+ishasPermitted);
	    
	    boolean ishasAllPermitted = subject.isPermittedAll("user:create","items:add");
	    System.out.println("多个权限判断"+ishasAllPermitted);
	    
	    //使用check方法进行授权,如果授权不通过会抛出异常
	    subject.checkPermission("items:add:1");
	}
	
}




















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值