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

WBOY

WBOY

2023-06-17

1238人浏览

原创

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 中添加以下代码:

<dependency><groupid>org.apache.shiro</groupid><artifactid>shiro-core</artifactid><version>1.5.3</version></dependency>
  1. 定义 Realm 类

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

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载

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

public class MyRealm extends AuthorizingRealm {
    
    // 根据用户名获取用户即其角色、权限等相关信息
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        // 获取当前用户的身份信息
        String username = (String) principalCollection.getPrimaryPrincipal();
        
        // 从数据库中查询用户及其角色
        User user = userService.loadByUsername(username);
        List<role> roles = roleService.getRolesByUsername(username);
        
        // 添加角色
        List<string> roleNames = new ArrayList();
        for (Role role : roles) {
            roleNames.add(role.getName());
        }
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addRoles(roleNames);
        
        // 添加权限
        List<string> permissionNames = new ArrayList();
        for (Role role : roles) {
            List<permission> 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;
    }
}</permission></string></string></role>

在上述代码中,我们通过实现 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<string> 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();
    }
}</string>

在上述代码中,我们使用 @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 来实现权限控制的功能。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

10

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

火山引擎对象存储使用教程
火山引擎对象存储使用教程

火山引擎对象存储适合用于网站图片、视频文件、备份数据、静态资源和应用附件管理。本专题整理TOS控制台入口、存储桶创建、地域选择、权限设置、文件上传、访问链接生成、CDN加速、费用查看和常见上传或访问失败问题,帮助用户快速掌握对象存储基础操作。

2026.08.04

1

10

火山引擎云服务器使用教程
火山引擎云服务器使用教程

火山引擎云服务器使用教程适合第一次购买、部署和管理云服务器的用户参考。本专题整理控制台入口、实例创建、地域和配置选择、系统镜像设置、安全组放行、远程连接、网站部署、续费计费和常见连接失败问题,帮助用户快速完成云服务器基础使用流程。

2026.08.04

5

10

火山引擎API Key绑定大模型教程
火山引擎API Key绑定大模型教程

火山引擎API Key怎么绑定大模型适合需要在火山方舟、应用后台、脚本工具或AI编程软件中调用模型的开发者参考。本专题整理控制台服务开通、API Key创建、模型权限检查、模型ID选择、Base URL填写、调用测试和鉴权失败排查,帮助用户完成从密钥到模型调用的配置流程。

2026.08.04

2

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习