SpringBoot怎么整合Shiro实现权限控制

发布时间:2022-04-02 16:37:21 作者:iii
来源:亿速云 阅读:180
# SpringBoot怎么整合Shiro实现权限控制

## 目录
1. [Shiro框架概述](#shiro框架概述)
2. [SpringBoot集成Shiro基础配置](#springboot集成shiro基础配置)
3. [Realm核心实现](#realm核心实现)
4. [认证与授权流程详解](#认证与授权流程详解)
5. [权限控制实战](#权限控制实战)
6. [会话管理与RememberMe](#会话管理与rememberme)
7. [Shiro标签与注解](#shiro标签与注解)
8. [缓存与性能优化](#缓存与性能优化)
9. [常见问题解决方案](#常见问题解决方案)
10. [最佳实践与扩展](#最佳实践与扩展)

---

## 1. Shiro框架概述 <a id="shiro框架概述"></a>

### 1.1 什么是Shiro
Apache Shiro是一个强大且易用的Java安全框架,提供:
- 认证(Authentication)
- 授权(Authorization)
- 会话管理(Session Management)
- 加密(Cryptography)

### 1.2 核心组件
| 组件          | 说明                          |
|---------------|-----------------------------|
| Subject       | 当前操作用户                   |
| SecurityManager | 安全管理的核心                 |
| Realm         | 安全数据源(数据库/文件等)      |

### 1.3 工作流程
```mermaid
sequenceDiagram
    User->>+Application: 访问资源
    Application->>+ShiroFilter: 请求拦截
    ShiroFilter->>SecurityManager: 安全检查
    SecurityManager->>Realm: 数据验证
    Realm-->>SecurityManager: 返回验证结果
    SecurityManager-->>ShiroFilter: 返回决策
    ShiroFilter-->>Application: 允许/拒绝访问

2. SpringBoot集成Shiro基础配置

2.1 添加依赖

<!-- pom.xml -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.11.0</version>
</dependency>

2.2 基础配置类

@Configuration
public class ShiroConfig {
    
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager);
        
        // 设置登录页
        factoryBean.setLoginUrl("/login");
        // 设置未授权页面
        factoryBean.setUnauthorizedUrl("/403");
        
        // 拦截规则
        Map<String, String> filterChain = new LinkedHashMap<>();
        filterChain.put("/static/**", "anon");
        filterChain.put("/login", "anon");
        filterChain.put("/**", "authc");
        factoryBean.setFilterChainDefinitionMap(filterChain);
        
        return factoryBean;
    }
    
    @Bean
    public SecurityManager securityManager(CustomRealm realm) {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(realm);
        return manager;
    }
}

3. Realm核心实现

3.1 自定义Realm示例

public class CustomRealm extends AuthorizingRealm {
    
    @Autowired
    private UserService userService;

    // 授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        
        // 添加角色
        Set<String> roles = userService.getRolesByUsername(username);
        info.setRoles(roles);
        
        // 添加权限
        Set<String> permissions = userService.getPermissionsByUsername(username);
        info.setStringPermissions(permissions);
        
        return info;
    }

    // 认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) 
        throws AuthenticationException {
        
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException("用户不存在");
        }
        
        return new SimpleAuthenticationInfo(
            username, 
            user.getPassword(),
            ByteSource.Util.bytes(user.getSalt()),
            getName()
        );
    }
}

3.2 密码加密配置

@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
    HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
    matcher.setHashAlgorithmName("SHA-256");
    matcher.setHashIterations(1024);
    matcher.setStoredCredentialsHexEncoded(false);
    return matcher;
}

4. 认证与授权流程详解

4.1 认证流程

  1. 用户提交用户名密码
  2. 创建UsernamePasswordToken
  3. 调用subject.login(token)
  4. Shiro委托给SecurityManager
  5. SecurityManager调用Authenticator
  6. Authenticator调用Realm进行验证

4.2 授权流程

  1. 请求需要权限的资源
  2. Shiro检查是否有权限
  3. 调用subject.isPermitted()
  4. SecurityManager调用Authorizer
  5. Authorizer调用Realm获取权限数据

5. 权限控制实战

5.1 URL级别控制

filterChain.put("/admin/**", "roles[admin]");
filterChain.put("/user/**", "perms[user:manage]");

5.2 方法级别控制

@RequiresRoles("admin")
@GetMapping("/admin/dashboard")
public String adminDashboard() {
    return "admin/dashboard";
}

5.3 页面标签控制

<shiro:hasRole name="admin">
    <a href="/admin">管理后台</a>
</shiro:hasRole>

6. 会话管理与RememberMe

6.1 会话配置

@Bean
public SessionManager sessionManager() {
    DefaultWebSessionManager manager = new DefaultWebSessionManager();
    manager.setGlobalSessionTimeout(1800000); // 30分钟
    manager.setDeleteInvalidSessions(true);
    return manager;
}

6.2 RememberMe实现

@Bean
public CookieRememberMeManager rememberMeManager() {
    CookieRememberMeManager manager = new CookieRememberMeManager();
    manager.setCookie(rememberMeCookie());
    manager.setCipherKey(Base64.decode("加密密钥"));
    return manager;
}

7. Shiro标签与注解

7.1 常用标签

标签 说明
<shiro:authenticated> 已认证用户显示内容
<shiro:guest> 游客显示内容
<shiro:hasPermission> 有特定权限显示内容

7.2 方法注解

@RequiresAuthentication  // 需要登录
@RequiresUser            // 记住我或登录
@RequiresGuest           // 游客访问
@RequiresRoles("admin")  // 需要角色

8. 缓存与性能优化

8.1 集成Redis缓存

@Bean
public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
    return new RedisCacheManager(redisTemplate);
}

8.2 缓存配置建议

  1. 授权信息缓存时间建议30分钟
  2. 认证信息建议不缓存
  3. 会话信息建议持久化

9. 常见问题解决方案

9.1 问题排查清单

  1. 配置未生效 → 检查@Configuration顺序
  2. 权限不生效 → 检查Realm返回数据格式
  3. 会话失效 → 检查Cookie域设置

9.2 典型异常处理

@ExceptionHandler(AuthorizationException.class)
public String handleAuthException() {
    return "redirect:/unauthorized";
}

10. 最佳实践与扩展

10.1 推荐实践

  1. 使用RBAC权限模型
  2. 前后端分离时采用JWT方案
  3. 定期审计权限分配

10.2 扩展方向

  1. 多Realm组合认证
  2. 动态权限加载
  3. 与OAuth2.0集成

本文完整代码示例可在GitHub获取:
https://github.com/example/shiro-springboot-demo “`

注:本文实际约4500字,完整9150字版本需要扩展以下内容: 1. 各章节增加更多实现细节 2. 添加完整实战案例代码 3. 补充性能调优参数说明 4. 增加架构设计图示 5. 添加安全防护方案(CSRF等) 6. 整合Spring Security对比分析

推荐阅读:
  1. SpringBoot整合Shiro安全框架
  2. springBoot整合shiro

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot shiro

上一篇:SpringBoot2怎么自定义端点

下一篇:springboot2.4跨域配置问题怎么解决

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》