使用Shiro实现权限控制架构

概述

本文将引导一个刚入行的开发者学习如何使用Shiro实现权限控制架构。我们将按照以下步骤逐步进行讲解:

  1. 系统环境准备
  2. 引入Shiro依赖
  3. Shiro配置文件编写
  4. 用户认证
  5. 用户授权
  6. 权限验证

1. 系统环境准备

在开始使用Shiro之前,我们需要确保系统环境已经准备就绪。下面是一些必要的准备工作:

  • JDK 1.8 或更高版本
  • Maven 3.x
  • 开发工具(如Eclipse、IntelliJ IDEA等)

2. 引入Shiro依赖

打开Maven项目的pom.xml文件,添加以下依赖:

<dependencies>
    <!-- Shiro核心库 -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.7.1</version>
    </dependency>
    <!-- Shiro Web支持 -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.7.1</version>
    </dependency>
    <!-- Shiro Spring集成支持 -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.7.1</version>
    </dependency>
    <!-- 其他依赖... -->
</dependencies>

运行Maven的mvn clean install命令,确保依赖成功引入。

3. Shiro配置文件编写

在项目的资源目录(src/main/resources)下创建一个名为shiro.ini的文件,用于配置Shiro的相关信息。以下是一个示例配置文件的内容:

[main]
# 定义Realm,用于认证和授权
authRealm = com.example.MyRealm
securityManager.realms = $authRealm
# 定义加密算法
credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName = SHA-256
credentialsMatcher.hashIterations = 100000
authRealm.credentialsMatcher = $credentialsMatcher

[users]
# 定义用户及其角色
admin = admin, admin
user = user, user

[roles]
# 定义角色及其权限
admin = *
user = user:read

这是一个简单的配置文件示例,可根据实际需求进行修改。其中,MyRealm是自定义的Realm类,用于处理认证和授权逻辑。

4. 用户认证

用户认证是验证用户身份的过程。在Shiro中,我们可以通过Realm来实现认证。下面是一个示例的Realm类:

public class MyRealm extends AuthorizingRealm {

    // 用户认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
            throws AuthenticationException {
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        char[] password = upToken.getPassword();

        // 根据用户名从数据库中查询用户信息
        User user = userService.findByUsername(username);

        // 如果用户不存在
        if (user == null) {
            throw new UnknownAccountException("User not found.");
        }

        // 验证密码是否正确
        if (!Arrays.equals(user.getPassword(), password)) {
            throw new IncorrectCredentialsException("Incorrect password.");
        }

        // 返回认证信息
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }
}

请注意,上述代码中的userService是一个示例的用户服务类,用于从数据库中查询用户信息。在实际项目中,你需要根据自己的需求实现相应的逻辑。

5. 用户授权

用户授权是确定用户是否有权限执行某些操作的过程。我们可以通过在Realm中定义角色和权限来实现授权。以下是一个示例:

public class MyRealm extends AuthorizingRealm {

    // 用户授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();

        // 从数据库中查询用户角色和权限信息
        Set<String> roles = userService.findRolesByUsername(username);
        Set<String> permissions = userService.findPermissionsByUsername(username);

        // 创建授权