上一篇博文总结了一下Shiro中的身份认证,本文主要来总结一下Shiro中的权限认证(Authorization)功能,即授权。如下:
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(); } }
权限认证和角色认证的测试一样的,我就不再赘述了。当然了,这里只是单纯的测试,实际中,认证完了后还要做一些具体的业务逻辑处理。
相关推荐
Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography)等核心功能。`shiro-1.7.1.zip`是一个包含...
2. **授权(Authorization)**:即权限控制,确定用户是否有执行特定操作的权限。Shiro提供角色(Role)和权限(Permission)的概念,可以对用户进行细粒度的权限分配。 3. **会话管理(Session Management)**:...
- **Authorization(授权)**:决定已认证的用户可以访问哪些资源或执行哪些操作。 - **Cryptography(加密)**:提供加密工具,保护敏感数据,如密码存储。 - **Session Management(会话管理)**:跨多个请求...
4. **org.apache.shiro.authz**: 授权(Authorization)模块,处理用户权限问题。Shiro可以基于角色、基于资源或者两者结合来进行权限控制,确保用户只能访问被授权的资源。 5. **org.apache.shiro.crypto**: 提供...
2. **授权(Authorization)**:授权是确定用户是否有执行特定操作的权限。Shiro 提供了角色和权限的概念,可以通过配置或者编程方式来实现复杂的权限控制。 3. **会话管理(Session Management)**:Shiro 可以...
2. **授权(Authorization)**:授权是确定用户是否有权限执行特定操作或访问特定资源。Shiro支持基于角色的访问控制(RBAC),你可以为角色分配权限,然后将这些权限授予用户。 3. **会话管理(Session Management...
2. **授权**(Authorization):即权限管理,确定用户是否有执行特定操作的权限。Shiro 提供了角色(Role)和权限(Permission)的概念,通过 `AuthorizingRealm` 来实现权限的授予和检查。 3. **会话管理**...
2. **授权(Authorization)**:授权涉及到确定用户是否有权限执行特定操作。Shiro可以基于角色进行授权,用户可以被分配到不同的角色,每个角色具有不同的权限。它也支持细粒度的权限控制,例如对特定资源的操作...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。Shiro 不仅可以用于Java Web 应用,也可以用于独立的Java应用,如Android应用或者桌面...
2. **授权(Authorization)**:即访问控制,确定已认证的用户可以访问哪些资源。Shiro 提供灵活的权限表达式语言,允许开发者精细控制权限,如“用户A可以查看部门B的员工信息”。 3. **加密(Cryptography)**:...
通常,Shiro的认证和授权逻辑会在控制器或服务层中调用,比如使用`Subject`对象进行登录尝试,或者通过`SecurityUtils`获取当前登录用户并进行权限检查。 8. **安全注解** Shiro提供了一些注解,如`@...
- **Authorization**: 分析`org.apache.shiro.authz`包,了解权限和角色的处理逻辑。 - **Session Management**: 研究`org.apache.shiro.session`和`org.apache.shiro.session.mgt`包,理解Shiro如何管理和存储会话...
1. **shiro-core-1.8.0.jar**:这是Shiro的核心模块,包含了主体(Subject)、安全管理者(SecurityManager)、认证(Authentication)、授权(Authorization)和会话管理(Session Management)的基础实现。...
2. **配置Shiro**:创建一个Shiro的配置类,定义Realm(认证和授权的实现),以及任何自定义的安全设置。例如,配置RememberMe服务,或自定义session的存储机制。 3. **整合Spring**:使用`DelegatingFilterProxy`...
2. **授权(Authorization)**:Shiro的授权功能允许开发者灵活地定义角色和权限,实现细粒度的访问控制。在项目中,可以设置角色对应的操作权限,通过Subject进行权限检查,确保用户只能访问其被授权的资源。 3. *...
在 Java SE(标准版)环境中,Shiro 可以帮助开发者轻松地实现用户认证、权限控制和应用的安全性。shiro-all-1.3.2.jar 文件包含了 Shiro 框架的所有核心组件和模块,使得开发者无需额外引入其他依赖就能使用 Shiro ...
1. **shiro-core-1.6.0.jar**:这是Shiro的核心库,包含了许多基础的安全管理功能,如身份验证(Authentication)、授权(Authorization)和会话管理(Session Management)。它提供了Subject、SecurityManager、...
在本案例中,我们将深入探讨如何将 Shiro 与 Spring(SSM)框架整合,实现用户登录认证和权限授予功能。 1. **Shiro 的核心组件**: - **Authentication(认证)**:验证用户身份,通常涉及到用户名和密码的验证。...
2. **授权(Authorization)**: Shiro 提供了细粒度的权限控制,可以对用户进行角色和权限的分配,控制用户访问资源的权限。 3. **会话管理(Session Management)**: Shiro 可以替代Servlet容器进行会话管理,支持...
2. **授权(Authorization)**:Shiro 的授权机制允许开发者根据角色或权限来控制对资源的访问。它支持基于角色的访问控制(RBAC)和基于权限的访问控制(PBAC),可以灵活地进行权限配置。 3. **会话管理(Session...