Shiro框架怎么使用

发布时间:2021-12-18 11:22:02 作者:iii
来源:亿速云 阅读:415
# Shiro框架怎么使用

## 目录
1. [Shiro框架简介](#shiro框架简介)
2. [核心架构解析](#核心架构解析)
3. [环境配置指南](#环境配置指南)
4. [认证流程实现](#认证流程实现)
5. [授权管理详解](#授权管理详解)
6. [会话管理实战](#会话管理实战)
7. [缓存机制优化](#缓存机制优化)
8. [加密功能应用](#加密功能应用)
9. [整合SpringBoot](#整合springboot)
10. [最佳实践建议](#最佳实践建议)

---

## Shiro框架简介
Apache Shiro是一个强大易用的Java安全框架,提供认证、授权、加密和会话管理等功能。相比Spring Security,Shiro以简单直观的API设计和模块化架构著称。

### 主要特性
- **四要素安全模型**:认证、授权、会话管理、加密
- **跨平台支持**:Web/非Web环境均可使用
- **低耦合设计**:可独立于容器运行
- **丰富的集成**:支持Spring、JPA等主流框架

---

## 核心架构解析
Shiro架构分为三个核心层次:

### 1. Subject层
```java
Subject currentUser = SecurityUtils.getSubject();

2. SecurityManager

DefaultSecurityManager securityManager = new DefaultSecurityManager();

3. Realm

public class MyRealm extends AuthorizingRealm {
    // 实现认证和授权逻辑
}

环境配置指南

Maven依赖

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.9.0</version>
</dependency>

基础配置类

public class ShiroConfig {
    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm());
        return manager;
    }
}

认证流程实现

1. 创建自定义Realm

public class UserRealm extends AuthorizingRealm {
    @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(
            user.getUsername(),
            user.getPassword(),
            getName());
    }
}

2. 登录控制器

@RequestMapping("/login")
public String login(String username, String password) {
    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    try {
        subject.login(token);
        return "redirect:/dashboard";
    } catch (AuthenticationException e) {
        return "login?error=true";
    }
}

授权管理详解

1. 权限声明方式

# shiro.ini示例
[roles]
admin = user:create, user:delete
user = user:view

2. 编程式授权

Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")) {
    // 执行管理操作
}

3. 注解式授权

@RequiresRoles("admin")
public void deleteUser(Long userId) {
    // 删除用户逻辑
}

会话管理实战

分布式会话配置

@Bean
public SessionManager sessionManager() {
    DefaultWebSessionManager manager = new DefaultWebSessionManager();
    manager.setSessionDAO(redisSessionDAO());
    return manager;
}

会话监听器

public class MySessionListener implements SessionListener {
    @Override
    public void onStart(Session session) {
        System.out.println("会话创建:" + session.getId());
    }
}

缓存机制优化

Ehcache集成

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>
    <version>1.9.0</version>
</dependency>

缓存配置

@Bean
public CacheManager cacheManager() {
    EhCacheManager cacheManager = new EhCacheManager();
    cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
    return cacheManager;
}

加密功能应用

密码哈希示例

public String encryptPassword(String password) {
    HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
    matcher.setHashAlgorithmName("SHA-256");
    matcher.setHashIterations(1024);
    return new SimpleHash(
        matcher.getHashAlgorithmName(),
        password,
        null,
        matcher.getHashIterations()).toHex();
}

整合SpringBoot

自动配置类

@Configuration
public class ShiroConfig {
    
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean();
        factory.setSecurityManager(securityManager);
        factory.setLoginUrl("/login");
        factory.setSuccessUrl("/index");
        
        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put("/static/**", "anon");
        filterMap.put("/**", "authc");
        factory.setFilterChainDefinitionMap(filterMap);
        
        return factory;
    }
}

最佳实践建议

  1. 安全策略

    • 强制密码复杂度要求
    • 实现登录失败锁定机制
  2. 性能优化

    • 合理设置缓存过期时间
    • 对高频访问接口进行权限缓存
  3. 审计日志

    public class AuditLogFilter extends AccessControlFilter {
       @Override
       protected boolean isAccessAllowed(ServletRequest request, 
           ServletResponse response, Object mappedValue) {
           // 记录访问日志
           logAccess(request);
           return true;
       }
    }
    
  4. 微服务适配

    • 采用JWT进行无状态认证
    • 实现自定义Realm对接统一认证中心

提示:生产环境建议开启Shiro的rememberMe功能时,使用AES加密并定期更换密钥


通过本文的全面介绍,开发者应该能够掌握Shiro框架的核心功能实现。建议在实际项目中从简单配置开始,逐步扩展安全功能模块。Shiro的灵活设计使其能够适应从单体应用到微服务架构的各种安全需求场景。 “`

注:本文实际约3200字(含代码示例),完整版可扩展以下内容: 1. 具体异常处理方案 2. 与OAuth2的集成示例 3. 多Realm的配置策略 4. 性能监控指标收集 5. 安全漏洞防护方案

推荐阅读:
  1. SpringBoot集成Shiro安全框架
  2. Apache shiro框架怎么用

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

shiro

上一篇:Spring Boot策略模式怎么使用

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

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

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