您的位置:首页 > 其它

Shiro 学习笔记(3)—— 授权初步

2016-02-09 12:31 369 查看
这一节是属于授权的内容,我们的例子是要说明如何判断主体是否有相应的角色和权限。

判断主体是否有相应的角色和权限
判断主体是否有相应的角色

判断主体是否有相应的权限

判断主体是否有相应的角色和权限

先把上一节写好的登录逻辑封装成一个工具类:

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.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

/**
* Created by liwei on 16/8/12.
*/
public class ShiroUtil {
public static Subject login(String iniFileName, String username, String passaword) {
// 注意:这里 SecurityManager 所在的包名
// 读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:" + iniFileName);
SecurityManager securityManager = factory.getInstance();
// 把 securityManager 的实例绑定到 SecurityUtils 上
SecurityUtils.setSecurityManager(securityManager);
// 得到当前执行的用户
Subject currentUser = SecurityUtils.getSubject();
// 自己创建一个令牌
UsernamePasswordToken token = new UsernamePasswordToken(username, passaword);
try {
// 身份认证
currentUser.login(token);
System.out.println("登录验证通过。");
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("登录验证失败!");
}
return currentUser;
}
}


判断主体是否有相应的角色

配置文件片段:

[users]
# 表示内存中有一个用户(用户名 liwei,密码 123456),他的角色是 role1 、role2
liwei=123456,role1,role2
zhouguang=123456,role1


我们可以看到一个用户具有的角色是通过一个字符串的集合来表示的。

测试代码:

public class RoleTest {

/**
* 测试是否有角色,测试方法 hasRole
*/
@Test
public void testHasRole(){
Subject currentUser = ShiroUtil.login("classpath:shiro_role.ini","liwei","123456");
System.out.println(currentUser.hasRole("role1"));
System.out.println(currentUser.hasRole("role2"));
// 测试是否分别有三个角色
boolean[] results = currentUser.hasRoles(Arrays.asList("role1","role2","role3"));
for(boolean result:results){
System.out.println(result);
}
// 区别上面的方法,下面的方法测试的是,一个角色是否同时拥有指定的几个角色
System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2")));
System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2","role3")));
currentUser.logout();
}

/**
* 与上面的方法的不同之处在于,角色验证没有通过,抛出运行时异常
*/
@Test
public void testCheckRole(){
Subject currentUser = ShiroUtil.login("classpath:shiro_role.ini","liwei","123456");
currentUser.checkRole("role1");
currentUser.checkRole("role2");
currentUser.checkRoles(Arrays.asList("role1","role2"));
// 下面的代码抛出 org.apache.shiro.authz.UnauthorizedException 异常
currentUser.checkRoles("role1","role2","role3");
}
}


判断主体是否有相应的权限

配置文件片段:

[users]
liwei=123456,role1,role2
zhouguang=123456,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete


测试代码:

/**
* Created by Liwei on 2016/2/9.
*/
public class PermissionTest {

@Test
public void testIsPermitted(){
Subject currentUser = ShiroUtil.login("classpath:shiro_permission.ini", "liwei", "123456");
System.out.println(currentUser.isPermitted("user:select"));
System.out.println(currentUser.isPermitted("user:update"));
System.out.println(currentUser.isPermitted("user:add"));
System.out.println(currentUser.isPermitted("user:delete"));
// 测试是否分别有指定的权限
boolean[] results = currentUser.isPermitted("user:select","user:update","user:add","user:delete");
for(boolean result:results){
System.out.println(result);
}
// 测试是否拥有全部的权限
System.out.println(currentUser.isPermittedAll("user:select","user:update","user:add","user:delete"));
currentUser.logout();
}

@Test
public void testCheckPermitted(){
Subject currentUser = ShiroUtil.login("classpath:shiro_permission.ini", "liwei", "123456");
currentUser.checkPermission("user:select");
currentUser.checkPermissions("user:select","user:update","user:add","user:delete");
currentUser.logout();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shiro