【Shiro】Apache Shiro架构之权限认证(Authorization)

  上一篇博文总结了一下Shiro中的身份认证,本文主要来总结一下Shiro中的权限认证(Authorization)功能,即授权。如下:

  本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authorization.html

  本文遵循以下流程:先介绍Shiro中的权限认证,再通过一个简单的实例来具体说明一下API的使用(基于maven)。

1. 权限认证的核心要素

  权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。在权限认证中,最核心的三个要素是:权限,角色和用户:

权限(permission):即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;

角色(role):指的是用户担任的的角色,一个角色可以有多个权限;

用户(user):在Shiro 中,代表访问系统的用户,即上一篇博文提到的Subject认证主体。

  它们之间的的关系可以用下图来表示:

  一个用户可以有多个角色,而不同的角色可以有不同的权限,也可由有相同的权限。比如说现在有三个角色,1是普通角色,2也是普通角色,3是管理员,角色1只能查看信息,角色2只能添加信息,管理员都可以,而且还可以删除信息,类似于这样。

2.1 基于角色的访问控制

  也就是说,授权过程是通过判断角色来完成的,哪个角色可以做这件事,哪些角色可以做这件事等等。它有如下API:

方法 作用
hasRole(String roleName) 判断是否有该角色访问权,返回boolen
hasRoles(List<String> roleNames) 判断是否有这些这些角色访问权,返回boolean[]
hasAllRoles(Collection<String> roleNames) 判断是否有这些这些角色访问权,返回boolean

  对这三个API,做一下简单的说明,第一个很简单,传入一个role即可,判断是否拥有该角色访问权,第二个方法是传入一个role的集合,然后Shiro会根据集合中的每一个role做一下判断,并且将每次的判断结果放到boolean[]数组中,顺序与集合中role的顺序一致;第三个方法也是传入一个role的集合,不同的是,返回boolean类型,必须集合中全部role都有才为true,否则为false。

  用法如下:

Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("administrator")) {
    //show the admin button or do administrator‘s things
} else {
    //don‘t show the button?  Grey it out? or others...
}

  除了这三个API外,Shiro还提供了check的API,与上面不同的是,has-xxx会返回boolean类型的数据,用来判断,而check-xxx不会返回任何东西,如果验证成功就继续处理下面的代码,否则会抛出一个异常,可以用来通过捕获异常来处理。API如下:

方法 作用
checkRole(String roleName) 如果判断失败抛出AuthorizationException异常
checkRoles(String... roleNames) 如果判断失败抛出AuthorizationException异常
checkRoles(Collection<String> roleNames) 如果判断失败抛出AuthorizationException异常

  类似的使用方法如下:

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is a bank teller and
//therefore allowed to open the account:
currentUser.checkRole("bankTeller");
openBankAccount();

2.2 基于权限的访问控制

  基于权限的访问控制和基于角色的访问控制在原理上是一模一样的,只不过API不同而已,我不再做过多的解释,API如下:

方法 作用
isPermitted(String perm) 判断是否有该权限,返回boolen
isPermitted(List<String> perms) 判断是否有这些这些权限,返回boolean[]
isPermittedAll(Collection<String> perms) 判断是否有这些这些权限,返回boolean
checkPermission(String perm) 如果判断失败抛出AuthorizationException异常
checkPermissions(String... perms) 如果判断失败抛出AuthorizationException异常
checkPermissionsAll(Collection<String> perms) 如果判断失败抛出AuthorizationException异常

3. 权限认证示例代码

  不管是身份认证还是权限认证,首先都需要创建SecurityManager工厂,SecurityManager,所以首先新建一个工具类专门做这个事情。

public class ShiroUtil {

    public static Subject login(String configFile, String username,
            String password) {

        // 读取配置文件,初始化SecurityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
        // 获取securityManager实例
        SecurityManager securityManager = factory.getInstance();
        // 把securityManager实例绑定到SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);
        // 得到当前执行的用户
        Subject currentUser = SecurityUtils.getSubject();
        // 创建token令牌,用户名/密码
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try{
            // 身份认证
            currentUser.login(token);
            System.out.println("身份认证成功!");
        }catch(AuthenticationException e){
            e.printStackTrace();
            System.out.println("身份认证失败!");
        }
        return currentUser;
    }
}

  提供一个静态方法,返回当前用户,在应用程序中我们直接调用这个类中的静态方法即可返回当前认证的用户了。

  maven中的pom.xml文件内容和上一节一样的,不再赘述。

  Shiro的配置文件shiro.ini:

#用户,role表示各个角色
[users]
csdn1=123,role1,role2,role3
csdn2=123,role1,role2

#定义不同角色都拥有哪些权限
[roles]
role1=user:select
role2=user:add,user:update
role3=user.delete

角色认证:

public class RoleTest {

    @Test
    public void testHasRole() {

        String configFile = "classpath:shiro.ini";
        String username = "csdn2";
        String password = "123";
        Subject currentUser = ShiroUtil.login(configFile, username, password);

        //测试hasRole
        System.out.println(currentUser.hasRole("role2")? "有role2这个角色" : "没有role2这个角色");

        //测试hasRoles
        boolean[] results = currentUser.hasRoles(Arrays.asList("role1","role2","role3"));
        System.out.println(results[0]? "有role1这个角色" : "没有role1这个角色");
        System.out.println(results[1]? "有role2这个角色" : "没有role2这个角色");
        System.out.println(results[2]? "有role3这个角色" : "没有role3这个角色");

        //测试hasAllRoles     System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2","role3")));

        currentUser.logout();
    }

    @Test
    public void testCheckRole() {

        String configFile = "classpath:shiro.ini";
        String username = "csdn2";
        String password = "123";
        Subject currentUser = ShiroUtil.login(configFile, username, password);

//      currentUser.checkRole("role3");//没有返回值。有就不报错,没有就会报错
//      currentUser.checkRoles(Arrays.asList("role1","role2","role3")); //同上
        currentUser.checkRoles(Arrays.asList("role1","role2")); //同上

        currentUser.logout();
    }
}

  权限认证和角色认证的测试一样的,我就不再赘述了。当然了,这里只是单纯的测试,实际中,认证完了后还要做一些具体的业务逻辑处理。



—–乐于分享,共同进步!

—–我的博客主页:http://blog.csdn.net/eson_15

时间: 2024-11-08 18:15:19

【Shiro】Apache Shiro架构之权限认证(Authorization)的相关文章

Apache Shiro 使用手册(一)Shiro架构介绍

一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户"登录": 授权 - 访问控制: 密码加密 - 保护或隐藏数据防止被偷窥: 会话管理 - 每用户相关的时间敏感的状态. 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务.并且相对于其他安全框架,Shiro要简单的多. 二.Shiro的架构介绍 首先,来了解一下Shiro的三个核心组件:Subject. Security

Shiro权限认证

   一.权限认证核心要素 权限认证顾名思义,就是在应用系统中,控制谁能访问哪些资源.核心要素有仨:权限.角色.用户 权限:即操作资源的权利,如访问某个url,对某个模块数据进行增删改查 角色:权限的集合,一种角色可以包含多种权限.例如操作员角色可查看系统账单.进行结账操作多种权限. 用户:也就是身份认证中提到的subject一角. 二.授权 shiro授权的方式通常有三种: 1.编程式授权:在代码中进行授权操作,可基于角色和权限两种方式. 2.注解式授权:使用注解对方法或类进行授权,标注该类可

【Shiro】Apache Shiro架构之身份认证(Authentication)

Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障.本文主要介绍一下Shiro中的身份认证功能,如下: 本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authentication.html. 本文遵循以下流程:先介绍Shiro中的身份认证,再通过一个实例来具体说明一下(基于maven). 1. 认证主体(Authenticating Subjects) Subject 认证主体包

Apache Shiro权限框架理论介绍

Apache Shiro权限管理框架介绍 Apache Shiro的官网地址如下: http://shiro.apache.org/ Apache Shiro是一个简单易用且强大而灵活的开源Java安全框架,以下简称Shiro.它干净利落地处理身份认证.授权以及企业会话管理和加密.Shiro拥有易于理解的API,你可以快速且容易地使用它来保护任何应用程序--从最小的移动应用程序到最大的web和企业应用程序. Shiro权限基础概念: 安全实体:就是被权限系统保护的对象,比如工资数据. 权限:就是

Apache Shiro系列四:Shiro的架构

Shiro的设计目标就是让应用程序的安全管理更简单.更直观. 软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如果用户登录了我们的系统,我就给他们显示一个按钮,点击之后可以查看他自己的账户信息.如果没有登录,我就给他显示一个注册按钮.” 上述应用程序在很大程度上是为了满足用户的需求而编写的,即便这个“用户”不是人,而是一个其他的软件系统.你仍然是按照谁当前正在与你的系统交互的逻辑来编写你的逻辑代码. Shiro的设计

【Apache Shiro】Authorization

Authorization 说说权限的一些东东,不是Authentication,是Authorization. 简单说就是access control即访问控制,控制用户对某个资源的访问. 比如说,是否可以查看某个页面.修改某个数据,甚至能不能看到某个按钮. 我们通常用三种元素进行授权操作,分别是: ·Permissions: 这个在Shiro中代表粒度(granularity)最小的(原子性)的安全策略. 权限的粒度也可以再细化三个等级: ·资源:比如我可以对用户信息进行修改 ·实例:我可以

Shiro安全框架之权限认证(授权)

第一讲.权限认证核心要素 权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源. 在权限认证中,最核心的三个要素是:权限,角色和用户: Authorization has three core elements that we reference quite a bit in Shiro: permissions, roles, and users. 权限permissions,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利: 角色,是权限的集合,一中

【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他URL,均跳转至登录页面 ② 登录涉及帐号和密码,帐号错误提示帐号错误,密码错误提示密码错误 ③ 登录成功跳转至首页,首页显示登录者帐号信息,并有注销帐号功能,点击注销退出系统 ------------------------------------------------------------------

Spring Security和Apache Shiro开发企业级权限管理系统

原理回顾什么是权限管理?权限管理是系统的安全范畴,要求必须是合法的用户才可以访问系统(用户认证),且必须具有该 资源的访问权限才可以访问该 资源(授权).认证:对用户合法身份的校验,要求必须是合法的用户才可以访问系统.授权:访问控制,必须具有该 资源的访问权限才可以访问该 资源.权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色权限关系.权限分配:通过UI界面方便给用户分配权限,对上边权限模型进行增.删.改.查操作.权限控制:基于角色的权限控制:根据角色判断