当前位置:首页 > 文章列表 > 文章 > java教程 > Java API 开发中使用 Apache Shiro 进行权限控制

Java API 开发中使用 Apache Shiro 进行权限控制

2024-03-29 18:59:36 0浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Java API 开发中使用 Apache Shiro 进行权限控制》,聊聊,我们一起来看看吧!

Java API 开发中使用 Apache Shiro 进行权限控制

随着互联网技术的发展,越来越多的应用程序采用了基于 API 的架构。对于这种架构来说,数据或服务都以 API 的形式暴露给外部系统或者应用程序。在这种情况下,用户权限的控制是非常重要的。本文主要介绍如何使用 Apache Shiro 来管理 Java API 中的权限问题。

Apache Shiro 的概述

Apache Shiro 是 Apache 软件基金会的一个开源框架,用于在应用程序中提供安全认证、授权、密码管理和会话管理等基本功能。Apache Shiro 是一种简单、易于使用的安全框架,使得 Java 开发者能够专注于业务逻辑而不用担心安全问题。

Apache Shiro 的主要组成部分包括:

  1. Subject:代表一个与我们的应用程序交互的用户,可以是人、程序、服务等。每个 Subject 都有一组安全相关的“身份”(principal),这些身份可用来表示用户的身份。
  2. SecurityManager:用于管理应用程序的安全操作。其主要职责是进行身份验证、授权、加密等。
  3. Realm:用于获取应用程序的数据,比如用户、角色、权限等等。数据可能存储在数据库、文件等等中。
  4. SessionManager:针对每个用户管理其会话信息,包括创建、失效、维护等。
  5. Session:为每个用户维护其会话信息,包括用户登录状态等。
  6. Cryptography:提供加密和哈希算法等安全服务。

基于上述组成部分,Shiro 提供了一套完整的安全框架,可以用于开发 Java 应用程序中的安全模块。

使用 Apache Shiro 进行权限控制

在开发 Java API 过程中,经常需要对用户进行权限控制,Shiro 提供了灵活精简的方案来实现该功能。下面介绍具体的实现方法:

  1. 引入 Shiro 依赖包

首先需要将 Shiro 的相关依赖包添加到项目中。例如,在 Maven 项目中,可以在 pom.xml 中添加以下代码:


    org.apache.shiro
    shiro-core
    1.5.3
 
  1. 定义 Realm 类

在 Shiro 中,Realm 负责定义用户、角色和权限等相关数据,并将其与 Shiro 框架整合。因此,定义 Realm 类是进行权限控制的第一步。

我们可以自定义一个 Realm 类,来实现从数据库中获取用户相关信息的功能,如下所示:

public class MyRealm extends AuthorizingRealm {
    
    // 根据用户名获取用户即其角色、权限等相关信息
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        // 获取当前用户的身份信息
        String username = (String) principalCollection.getPrimaryPrincipal();
        
        // 从数据库中查询用户及其角色
        User user = userService.loadByUsername(username);
        List roles = roleService.getRolesByUsername(username);
        
        // 添加角色
        List roleNames = new ArrayList<>();
        for (Role role : roles) {
            roleNames.add(role.getName());
        }
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addRoles(roleNames);
        
        // 添加权限
        List permissionNames = new ArrayList<>();
        for (Role role : roles) {
            List permissions = permissionService.getPermissionsByRoleId(role.getId());
            for (Permission permission : permissions) {
                permissionNames.add(permission.getName());
            }
        }
        info.addStringPermissions(permissionNames);
        
        return info;
    }
    
    // 根据用户名和密码验证用户
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // 获取用户提交的身份信息
        String username = (String) authenticationToken.getPrincipal();
        String password = new String((char[]) authenticationToken.getCredentials());
        
        // 根据用户名查询用户
        User user = userService.loadByUsername(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        
        // 验证用户密码
        String encodedPassword = hashService.hash(password, user.getSalt());
        if (!user.getPassword().equals(encodedPassword)) {
            throw new IncorrectCredentialsException();
        }
        
        // 如果验证成功,则返回一个身份信息
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());
        return info;
    }
}

在上述代码中,我们通过实现 AuthorizingRealm 抽象类提供的 doGetAuthorizationInfo 方法和 doGetAuthenticationInfo 方法来获取用户的角色和权限信息,以及验证用户的身份。这些方法中都会调用 UserService、RoleService、PermissionService 等服务层来查询数据库中的相关信息,以便获取用户数据。

  1. 配置 Shiro Filter

在 Java API 中,我们可以配置 Shiro Filter 对请求进行拦截,实现对用户权限的控制。Shiro Filter 是一个 Servlet 过滤器,可以用于在 Web 应用中进行权限过滤、会话管理等。

在配置 Shiro Filter 时,我们需要配置 Shiro 的安全管理器、自定义的 Realm 类、编写好的登录页面等等。示例如下所示:

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);

        // 设置登录URL
        shiroFilter.setLoginUrl("/login");
        // 设置无权访问的URL
        shiroFilter.setUnauthorizedUrl("/unauthorized");
        
        // 配置拦截器规则
        Map filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/home", "authc");
        filterChainDefinitionMap.put("/admin/**", "roles[admin]");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilter;
    }

    @Bean
    public SecurityManager securityManager(MyRealm myRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm);

        return securityManager;
    }
    
    @Bean
    public MyRealm myRealm(HashService hashService,
                           UserService userService,
                           RoleService roleService,
                           PermissionService permissionService) {
        return new MyRealm(userService, roleService, permissionService, hashService);
    }
    
    @Bean
    public HashService hashService() {
        return new SimpleHashService();
    }
}

在上述代码中,我们使用 @Configuration 注解定义了一个 ShiroConfig 类,用于配置 Shiro 相关的参数。在这个类中,我们定义了 shirFilter() 方法、securityManager() 方法以及 myRealm() 方法,用于配置 Shiro 过滤器、安全管理器以及自定义 Realm 类。在对应的方法中,我们可以通过依赖注入的方式,使用 UserService、RoleService、PermissionService、HashService 等依赖来注入相关的服务,以实现权限控制和用户验证。

  1. 在 Java API 中使用 Shiro 进行权限控制

在完成上述步骤后,我们就可以在 Java API 中使用 Shiro 进行权限控制了。在具体实现时,我们可以使用 Shiro 提供的 Subject 类来表示当前用户。我们可以通过该类的 hasRole()、isPermitted() 等方法来检查用户是否拥有某个角色或权限。以下是一个例子:

@Controller
public class ApiController {

    @RequestMapping("/api/test")
    @ResponseBody
    public String test() {
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser.hasRole("admin")) {
            return "Hello, admin!";
        } else if (currentUser.isAuthenticated()) {
            return "Hello, user!";
        } else {
            return "Please login first!";
        }
    }
}

在上述代码中,我们定义了一个 ApiController 类,并在其中定义了一个 test() 方法。在该方法中,我们首先获取当前用户 Subject 对象,然后通过调用 hasRole()、isPermitted() 等方法来进行权限判断。

总结

Java API 开发中,权限控制是一个非常重要的问题。Apache Shiro 提供了一套方便易用的安全框架,可以帮助 Java 开发者快速实现用户认证、授权、密码管理和会话管理等功能。通过本文的介绍,希望读者能够清楚地了解如何在 Java API 开发中使用 Shiro 来实现权限控制的功能。

到这里,我们也就讲完了《Java API 开发中使用 Apache Shiro 进行权限控制》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于java,Shiro,API的知识点!

PHP中的长连接和短连接的区别PHP中的长连接和短连接的区别
上一篇
PHP中的长连接和短连接的区别
win10开始菜单怎么变回win7风格_win10开始菜单变回win7风格方法
下一篇
win10开始菜单怎么变回win7风格_win10开始菜单变回win7风格方法
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 美图AI抠图:行业领先的智能图像处理技术,3秒出图,精准无误
    美图AI抠图
    美图AI抠图,依托CVPR 2024竞赛亚军技术,提供顶尖的图像处理解决方案。适用于证件照、商品、毛发等多场景,支持批量处理,3秒出图,零PS基础也能轻松操作,满足个人与商业需求。
    16次使用
  • SEO标题PetGPT:智能桌面宠物程序,结合AI对话的个性化陪伴工具
    PetGPT
    SEO摘要PetGPT 是一款基于 Python 和 PyQt 开发的智能桌面宠物程序,集成了 OpenAI 的 GPT 模型,提供上下文感知对话和主动聊天功能。用户可高度自定义宠物的外观和行为,支持插件热更新和二次开发。适用于需要陪伴和效率辅助的办公族、学生及 AI 技术爱好者。
    15次使用
  • 可图AI图片生成:快手可灵AI2.0引领图像创作新时代
    可图AI图片生成
    探索快手旗下可灵AI2.0发布的可图AI2.0图像生成大模型,体验从文本生成图像、图像编辑到风格转绘的全链路创作。了解其技术突破、功能创新及在广告、影视、非遗等领域的应用,领先于Midjourney、DALL-E等竞品。
    43次使用
  • MeowTalk喵说:AI猫咪语言翻译,增进人猫情感交流
    MeowTalk喵说
    MeowTalk喵说是一款由Akvelon公司开发的AI应用,通过分析猫咪的叫声,帮助主人理解猫咪的需求和情感。支持iOS和Android平台,提供个性化翻译、情感互动、趣味对话等功能,增进人猫之间的情感联系。
    44次使用
  • SEO标题Traini:全球首创宠物AI技术,提升宠物健康与行为解读
    Traini
    SEO摘要Traini是一家专注于宠物健康教育的创新科技公司,利用先进的人工智能技术,提供宠物行为解读、个性化训练计划、在线课程、医疗辅助和个性化服务推荐等多功能服务。通过PEBI系统,Traini能够精准识别宠物狗的12种情绪状态,推动宠物与人类的智能互动,提升宠物生活质量。
    38次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码