当前位置: 首页 > article >正文

Shiro授权

在 Java 安全领域,Apache Shiro 以其强大的功能和灵活性备受开发者青睐。其中,授权机制是 Shiro 的核心功能之一,它确保了用户只能访问其被授权的资源。本文将深入探讨 Shiro 授权,涵盖静态和动态授权、权限、角色、隐式角色、显式角色、授权流程以及授权方式等方面。

一、Shiro 简介

Apache Shiro 是一个功能强大的 Java 安全框架,它提供了认证、授权、加密和会话管理等功能。Shiro 的设计目标是简化安全开发,使开发人员能够专注于业务逻辑,而不必过多关注安全细节。

二、权限与角色的概念

(一)权限

权限是对特定资源的操作许可。例如,对文件的读取、写入、删除权限,对数据库的查询、插入、更新、删除权限等。在 Shiro 中,权限通常用字符串表示,如 “file:read” 表示对文件的读取权限。

(二)角色

角色是一组权限的集合。它代表了用户在系统中的职能或职责。例如,管理员角色可能拥有对系统的所有权限,而普通用户角色可能只有部分权限。在 Shiro 中,角色也用字符串表示,如 “admin” 表示管理员角色。

(三)隐式角色与显式角色

  1. 隐式角色:隐式角色是通过权限推断出来的角色。例如,如果一个用户拥有 “file:read” 和 “file:write” 权限,那么可以推断出该用户可能具有 “文件编辑者” 这个隐式角色。隐式角色的优点是可以灵活地根据权限动态确定用户的角色,而不需要在系统中显式地定义所有角色。
  2. 显式角色:显式角色是在系统中明确定义的角色。例如,在系统配置文件中或数据库中定义的 “admin”、“user” 等角色。显式角色的优点是易于理解和管理,开发人员可以清楚地知道用户的角色和相应的权限。

三、授权流程

(一)用户认证

在进行授权之前,用户首先需要进行认证。认证是验证用户身份的过程,通常通过用户名和密码进行。Shiro 提供了多种认证方式,如用户名 / 密码认证、LDAP 认证、数据库认证等。

(二)获取用户信息

一旦用户认证成功,Shiro 会获取用户的身份信息,包括用户名、角色和权限等。这些信息可以从数据库、LDAP 目录或其他数据源中获取。

(三)授权判断

在用户请求访问某个资源时,Shiro 会根据用户的角色和权限进行授权判断。如果用户拥有访问该资源的权限,则允许访问;否则,拒绝访问。授权判断可以基于静态授权或动态授权。

四、授权方式

(一)静态授权

  1. 定义与特点:静态授权是指在配置文件或代码中预先定义好用户的权限信息,这些权限信息在应用运行期间不会发生变化。静态授权的特点是简单直观、性能高效,适合权限较为固定的场景。
  2. 配置方式:
    • 在 XML 配置文件中,可以使用 <shiro:permission> 标签来定义用户的权限。例如:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <property name="loginUrl" value="/login.jsp"/>
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
    <property name="filters">
        <map>
            <entry key="authc" value-ref="formAuthenticationFilter"/>
        </map>
    </property>
    <property name="filterChainDefinitions">
        <value>
            /login.jsp = authc
            /logout = logout
            /admin/** = roles[admin]
            /user/** = roles[user]
        </value>
    </property>
</bean>

在上面的配置中,/admin/** 和 /user/** 分别定义了管理员和普通用户的访问路径,通过 roles[admin] 和 roles[user] 来指定相应的角色权限。

  • 在 Java 代码中,可以使用 IniSecurityManagerFactory 来加载配置文件,并创建 SecurityManager。然后,通过 Subject 对象来进行授权验证。例如:
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated()) {
    UsernamePasswordToken token = new UsernamePasswordToken("username", "password");
    token.setRememberMe(true);
    currentUser.login(token);
}

if (currentUser.hasRole("admin")) {
    // 用户具有管理员角色,可以执行相应的操作
}

(二)动态授权

  1. 定义与特点:动态授权是指在应用运行期间,根据用户的身份、角色、请求参数等动态地确定用户的权限。动态授权的特点是灵活性高、可扩展性强,适合权限变化频繁、业务逻辑复杂的场景。
  2. 实现方式:
    • 使用 Shiro 的 AuthorizingRealm 类来实现自定义的授权逻辑。在 doGetAuthorizationInfo 方法中,可以根据用户的身份信息查询数据库或其他数据源,获取用户的权限信息,并返回给 Shiro。例如:

收起

java

复制

public class MyAuthorizingRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        // 根据用户名查询数据库,获取用户的角色和权限信息
        List<String> roles = getUserRoles(username);
        List<String> permissions = getUserPermissions(username);
        authorizationInfo.addRoles(roles);
        authorizationInfo.addStringPermissions(permissions);
        return authorizationInfo;
    }
}
  • 在 Shiro 的过滤器中,可以通过实现 AccessControlFilter 接口来进行动态授权。在 onPreHandle 方法中,可以根据请求参数、用户身份等信息进行授权判断,并返回相应的结果。例如:
public class MyAccessControlFilter extends AccessControlFilter {
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        Subject currentUser = getSubject(request, response);
        if (currentUser.isAuthenticated()) {
            // 用户已认证,根据请求参数进行授权判断
            String requestParam = request.getParameter("param");
            if (isAuthorized(requestParam)) {
                return true;
            }
        }
        return false;
    }
}

http://www.kler.cn/news/368809.html

相关文章:

  • 大厂面试真题-说一说LBCC
  • springboot基本概念
  • python学习之for i in...
  • 华为鸿蒙HarmonyOS应用开发者高级认证视频及题库答案
  • Http 状态码 301 Permanent Rediret 302 Temporary Redirect
  • Python -- 网络爬虫
  • 网络应用技术 实验一:路由器实现不同网络间通信(华为ensp)
  • 镜舟科技荣获中国信通院 2024 OSCAR 尖峰开源商业化案例奖
  • 模板进阶
  • 深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间
  • 算法的学习笔记—翻转单词顺序列(牛客JZ73)
  • HarmonyOS Next API12最新版 端云一体化开发-云函数篇
  • 如何快速分析音频中的各种频率成分
  • Vue学习笔记(六)
  • 纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发
  • linux中级(NFS服务器)
  • Spring Boot集成Shiro授权
  • 极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【一】
  • mysqld.log文件过大,清理后不改变所属用户
  • c++设计通信类
  • react 总结+复习+应用加深
  • P11227 [CSP-J 2024] 扑克牌(民间数据)
  • 环 境 配 置
  • 【递归、回溯及搜索】No.4---综合练习
  • 【Spring MVC】请求参数的传递
  • 人工智能岗位英语面试 - 如何确保模型的可靠性和性能