Shiro学习(3)shiroConfig配置类

本文详细介绍了如何在项目中配置Apache Shiro权限管理系统,包括创建Realm、安全管理器、Shiro过滤器工厂及启用Shiro注解支持的过程。

一、Shiro配置类创建流程

创建shiro配置函数ShiroConfig可以分为四大块:
1、创建realm
2、创建安全管理器
3、配置shiro过滤器工厂
4、开启对shiro注解的支持

1、创建Realm

可以直接创建CustonRealm这个对象,也可以通过Realm创建。

	@Bean
    public Realm getRealm(){
        CustonRealm custonRealm = new CustonRealm();
        return custonRealm;
    }
2、创建安全管理器

注意SecurityManager导包,是shiro的SecurityManager。
配置原理:对SecurityManager来说他管理了所有的Realm,通过这些代码获取了Realm管理信息

	@Bean
    public SecurityManager getSecurityManager(Realm realm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }
3、配置shiro过滤器工厂

在web程序中,shiro进行权限控制是通过一组过滤器集合进行的操作。
过滤器配置需要有以下几步:
1、创建过滤器工厂
2、设置安全管理器
3、通用配置(跳转登录页面,为授权跳转的页面)
4、设置过滤器集合

	@Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){
        //1、创建过滤器工厂
        ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean();
        //2、设置安全管理器
        filterFactory.setSecurityManager(securityManager);
        //3、通用配置(跳转登录页面,为授权跳转的页面)
        filterFactory.setLoginUrl("/autherror?code=1");//授权成功,跳转的url地址
        filterFactory.setUnauthorizedUrl("/autherror?code=2");//未授权的跳转页面
        //4、设置过滤器集合
        /**
         * 设置所有过滤器,使用有顺序的map
         *  key->拦截url地址
         *  value-> 过滤器类型
         */
        Map<String,String> filterMap = new LinkedHashMap<>();
        filterMap.put("/user/home","anon");//无需认证即可访问
        filterMap.put("/user/**","authc");//当前请求地址必须认证后访问
        filterFactory.setFilterChainDefinitionMap(filterMap);
        return filterFactory;
    }
4、开启对shiro注解的支持

固定配置

	@Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }
### 配置Shiro使用Redis作为会话管理器 为了实现Shiro与Redis的集成,需要在Spring Boot项目中配置`RedisSessionManager`并将其注入到Shiro的安全管理器中。以下是详细的步骤和代码示例。 #### 依赖配置 确保项目中已包含Shiro和Redis相关的依赖: ```xml <dependencies> <!-- Apache Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Lettuce Pool for Redis connection pooling --> <dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>6.2.0</version> </dependency> </dependencies> ``` #### 配置文件设置 在`application.yml`中配置Redis连接信息: ```yaml spring: redis: host: localhost port: 6379 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 2 max-wait: 2000ms ``` #### 创建RedisSessionManager类 实现一个基于Redis的会话管理器,用于处理会话的创建、读取、更新和删除操作: ```java import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; import org.springframework.data.redis.core.RedisTemplate; public class RedisSessionManager extends EnterpriseCacheSessionDAO { private final RedisTemplate<String, Object> redisTemplate; public RedisSessionManager(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } @Override protected Serializable doCreate(Session session) { Serializable sessionId = super.doCreate(session); redisTemplate.opsForValue().set(session.getId().toString(), session); return sessionId; } @Override protected Session doReadSession(Serializable sessionId) { return (Session) redisTemplate.opsForValue().get(sessionId.toString()); } @Override protected void doUpdate(Session session) { redisTemplate.opsForValue().set(session.getId().toString(), session); } @Override protected void doDelete(Session session) { redisTemplate.delete(session.getId().toString()); } } ``` #### 配置Shiro安全管理器 在Shiro配置类中注入`RedisSessionManager`,并将其设置为安全管理器的会话管理器: ```java import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.realm.Realm; import org.apache.shiro.session.mgt.SessionManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { @Bean public Realm realm() { return new MyCustomRealm(); } @Bean public SessionManager sessionManager(RedisTemplate<String, Object> redisTemplate) { return new RedisSessionManager(redisTemplate); } @Bean public SecurityManager securityManager(Realm realm, SessionManager sessionManager) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm); securityManager.setSessionManager(sessionManager); return securityManager; } @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); chainDefinition.addPathDefinition("/login", "anon"); chainDefinition.addPathDefinition("/**", "authc"); return chainDefinition; } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, ShiroFilterChainDefinition chainDefinition) { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); filterFactoryBean.setSecurityManager(securityManager); filterFactoryBean.setFilterChainDefinitionMap(chainDefinition.getFilterMap()); return filterFactoryBean; } } ``` #### 自定义Realm实现 实现自定义的Realm来处理认证和授权逻辑: ```java import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; public class MyCustomRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); if (!"admin".equals(username)) { throw new UnknownAccountException("账户不存在"); } return new SimpleAuthenticationInfo(username, "password", getName()); } } ``` 通过上述步骤,可以将Shiro配置为使用Redis作为会话存储,从而实现分布式环境下的会话管理[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值