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