SpringBoot中关于Shiro权限管理的整合使用

幽灵船长酱 2024-06-13 ⋅ 20 阅读

介绍

Spring Boot是一款快速开发Java应用的框架,而Shiro是一个强大且易用的Java安全框架。本文将介绍如何在Spring Boot项目中整合使用Shiro进行权限管理。

环境准备

  • JDK 1.8+
  • Maven 3.6.2+
  • Spring Boot 2.5.4
  • Shiro 1.7.1

步骤

第一步:创建Spring Boot项目

使用Spring Initializr创建一个新的Spring Boot项目。在pom.xml文件中添加Shiro和相关依赖。

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Shiro -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.7.1</version>
    </dependency>
</dependencies>

第二步:配置Shiro

在application.properties文件中添加Shiro的相关配置,如下所示:

# Shiro
# 配置Shiro的加密方式
shiro.credentialsMatcher.hashAlgorithmName=SHA-256
shiro.credentialsMatcher.hashIterations=1000
# 配置Shiro的登录url
shiro.user.loginUrl=/login
# 配置Shiro的权限url
shiro.user.unauthorizedUrl=/403

第三步:定义权限和角色

在数据库中创建用户、角色和权限表,并插入测试数据。定义角色和权限的关联关系,并为用户分配角色和权限。

第四步:实现认证和授权

创建一个自定义的Realm类,继承Shiro的AuthorizingRealm类,并重写认证和授权的方法。

public class CustomRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    // 认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // 获取用户名和密码
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        String username = token.getUsername();
        String password = String.valueOf(token.getPassword());

        // 根据用户名查询用户信息
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException();
        }

        // 验证密码
        if (!password.equals(user.getPassword())) {
            throw new IncorrectCredentialsException();
        }

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

    // 授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        // 获取当前认证的用户信息
        User user = (User) principalCollection.getPrimaryPrincipal();

        // 创建授权信息对象
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();

        // 查询用户角色并授权
        List<Role> roles = roleService.findByUserId(user.getId());
        for (Role role : roles) {
            authorizationInfo.addRole(role.getName());

            // 查询角色权限并授权
            List<Permission> permissions = permissionService.findByRoleId(role.getId());
            for (Permission permission : permissions) {
                authorizationInfo.addStringPermission(permission.getPermission());
            }
        }

        return authorizationInfo;
    }
}

第五步:配置Shiro的过滤器

在Spring Boot配置类中配置Shiro的过滤器。

@Configuration
public class ShiroConfig {

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

        // 登录URL
        shiroFilter.setLoginUrl("/login");

        // 没有权限的URL
        shiroFilter.setUnauthorizedUrl("/403");

        // 配置URL过滤规则
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // 登录URL放行
        filterChainDefinitionMap.put("/login", "anon");
        // 静态资源放行
        filterChainDefinitionMap.put("/static/**", "anon");
        // 除了登录和静态资源,其他URL都需要认证和授权
        filterChainDefinitionMap.put("/**", "authc");

        shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilter;
    }

    @Bean
    public SecurityManager securityManager(CustomRealm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }

    @Bean
    public CustomRealm realm() {
        return new CustomRealm();
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }
}

测试

启动Spring Boot项目,并在浏览器中访问相应的URL进行测试。

结论

通过整合使用Shiro实现Spring Boot项目的权限管理,可以更好地保护应用程序的安全性和数据的完整性。此外,Shiro还提供了丰富的身份认证和权限控制的机制,可以灵活地满足不同应用程序的需求。


全部评论: 0

    我有话说: